next up previous
Next: 5.2 set!のコード生成 Up: 5 スペシャルフォームのコンパイル Previous: 5 スペシャルフォームのコンパイル

5.1 beginのコード生成

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日