Next: 5.2 set!のコード生成
Up: 5 スペシャルフォームのコンパイル
Previous: 5 スペシャルフォームのコンパイル
beginで始まるフォームのコンパイルは,
beginフォーム内の要素を順にコンパイルしますが,
コンパイルコードは最後にスタックにデータを
積むというコードになっているので,
popでスタックからデータを取り除き
つつコード生成を行います.
(defun comp-begin (exps env)
(cond
((null exps) (gen 'CONST nil))
((null (cdr exps))
(comp (car exps) env))
(t (seq (comp (car exps) env)
(gen 'POP)
(comp-begin (cdr exps) env)))))
(defun seq (&rest code)
(apply #'append code))
beginの中に何もなければ計算結果としてnil
を返すために,constでnilをスタックにつむようにします.
begin手続きの最後の式がこの手続きの値になり,
それだけがスタックにつまれるというコードになります.
<cl> (comp-show '(begin))
ARGS 0
CONST NIL
RETURN
<cl> (comp-show '(begin a))
ARGS 0
GVAR A
RETURN
<cl> (comp-show '(begin a b c))
ARGS 0
GVAR A
POP
GVAR B
POP
GVAR C
RETURN
<cl> (comp-show '(begin (a 1) (b 2)))
ARGS 0
CONST 1
GVAR A
CALL 1
POP
CONST 2
GVAR B
CALL 1
RETURN
generated through LaTeX2HTML. M.Inaba 平成18年5月6日