next up previous
Next: 9.3 関数呼び出しの実行 Up: 9 Continuation操作機構をもつSchemeインタプリタ Previous: 9.1 インタプリタのトップレベル

9.2 スペシャルフォームの実行

スペシャルフォームごとに,再帰的にinterpを呼ぶ場合には, そのinterpに渡すcontinuationをccを使って更新し,呼ばない場合には, 渡されているccへ返す値を引数と渡してccを実行するという形に なります. quoteは,引数を返すだけなので,その返す値をccに適用します. lambdaも,クロージャを返すだけなので,その値をccに 適用します. beginは,第一引数をinterpする形に書いて,第二引数以降を 処理すべきであるというcontinuationをそのinterpに与える形になります. set!は,第二引数を先にinterpしてから,その結果を第一引数の変数に 代入するので,第一引数に代入を行う処理を行って,そこへ渡された ccを実行するというcontinuationを第二引数のinterpへ渡します. if では,条件判断部である第一引数をinterpした後,そのinterp結果に 応じて第二引数か第三引数をinterpに渡すことを行うcontinuationを 作ります.

(defun interp-specialform (name params env cc)
  (case
   name
   (quote (funcall cc (car params)))
   (begin (interp
           (car params) env
           #'(lambda (val)
               (if (null (cdr params))
                   (funcall cc val)
                 (interp-specialform
                  name (cdr params) env cc)))))
   (set!
    (interp (cadr params) env
            #'(lambda (val)
                (funcall cc
                         (set-var! (car params)
                                   val
                                   env)))))
   (if
       (interp (car params) env
               #'(lambda (pred)
                   (interp 
                    (if pred (cadr params)
                      (caddr params))
                    env cc))))
   (lambda
       (let* ((vars (car params))
              (code (cons 'begin (cdr params))))
         (funcall
          cc
          #'(lambda (cont &rest args)
              (interp
               code
               (extend-env vars args env)
               cont)))))
   ))


generated through LaTeX2HTML. M.Inaba 平成18年5月6日