next up previous
Next: 1.4 特殊シンボルと組み込み手続き(関数)の初期化 Up: 1 Schemeインタプリタの実現 Previous: 1.2 スペシャルフォームの処理

1.3 通常の手続き(関数)の処理

リストの処理や,数値計算などの手続きをクロージャとして定義してゆくには, 5つのスペシャルフォームだけでは不可能です.そこで,通常のLispと同様に, データを操作する手続きcar, cdr などが必要になります.そのような通常の 手続きの処理は interp-procedureでなされ,lambdaスペシャルフォームによ り生成されるクロージャがそこで処理されることになります. ここでは,そういった基本手続きの内容を作って示すのではなく,CommonLisp に定義されている関数定義の実態をそのまま利用することで行なうとします. つまり,たとえば,Schemeのcarという基本手続きの値としてCommonLispのcar の関数本体を代入しておきます.そうすると,Scheme-interpreterで(car a) が与えられると,carの値を取り,CommonLispのcarの関数本体をとりだし,次 に,aを評価した結果をその関数本体へapplyすることで計算ができます. lambdaのスペシャルフォームにより作られたクロージャも,carなどの こういった基本関数もどちらも,同じように引数すべてを評価した あと,関数本体に対してapplyするという形で実行できるため, 次のようにinterp-procedureを定義できます.

(defun interp-procedure (name params env)
  (apply (interp name env)
         (mapcar #'(lambda (v) (interp v env)) params)))


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