Next: 5.3 ifのコード生成
Up: 5 スペシャルフォームのコンパイル
Previous: 5.1 beginのコード生成
set!のコードは,代入される変数が環境envにあれば
LSETのコードを生成し,なければGSETのコードを生成します.
(defun gen-set (symbol env)
(let ((frame (find symbol env :test #'find)))
(if frame
(gen 'LSET (position frame env)
(position symbol frame) ";" symbol)
(gen 'GSET symbol))))
<cl> (comp-show '(set! a 10))
ARGS 0
CONST 10
GSET A
RETURN
NIL
<cl> (comp-show '(set! a '(a b c)))
ARGS 0
CONST (A B C)
GSET A
RETURN
NIL
<cl> (comp-show '(set! a (a b c)))
ARGS 0
GVAR B
GVAR C
GVAR A
CALL 2
GSET A
RETURN
NIL
<cl> (comp-show '(set! a (list 1 2 3)))
ARGS 0
CONST 1
CONST 2
CONST 3
GVAR LIST
CALL 3
GSET A
RETURN
NIL
<cl> (comp-show '(set! a (lambda (x) (list x))))
ARGS 0
FN
ARGS 1
LVAR 0 0 ; X
GVAR LIST
CALL 1
RETURN
GSET A
RETURN
<cl> (comp-show '(lambda (x) (set! x 10)))
ARGS 0
FN
ARGS 1
CONST 10
LSET 0 0 ; X
RETURN
RETURN
NIL
<cl> (comp-show
'(lambda (x) (lambda (y) (set! x y))))
ARGS 0
FN
ARGS 1
FN
ARGS 1
LVAR 0 0 ; Y
LSET 1 0 ; X
RETURN
RETURN
RETURN
NIL
generated through LaTeX2HTML. M.Inaba 平成18年5月6日