関数型言語の勉強にSICPを読もう - (52) 4章 - 超言語的抽象(213-217ページ) - apply
apply
実装の肝は apply と env のあたりだということに気づく。
(define (apply procedure arguments) (cond ((primitive-procedure? procedure) (apply-primitive-procedure procedure arguments)) ((compound-procedure? procedure) (eval-sequence (procedure-body procedure) (extend-environment (procedure-parameters procedure) arguments (procedure-environment procedure)))) (else (error "Unknown procedure type -- APPLY" procedure))))
ぱっと見ただけでは分からないのでいろいろと補足。
lambda式は
('lambda parameters body)
のようなデータ構造であらわされていて
lambda式はeval されると、make-procedureによってprocedure となります。
その際にprocedureはevalされたときの env を保持します。
そのprocedureがapplyされると lambda式の定義に使われた parameters, procedureの引数 argumentsを利用して env が拡張されます。
そもそも envは複数のFrameを保持していて、Frame は key=value形式のデータ構造で
A = 12
B = 1
などのように変数を保持しているのですが、そこに
parameter = argument
の形で値が追加されているのが extentd-environmentです。
その拡張された env 下で、eval-sequenceにより procedure bodyの要素が1つずつ実行されていくというからくりです。
bodyの要素は何らかの exp なのですがその中で lookup-variableで束縛されている変数を参照します。
計算機プログラムの構造と解釈
posted with amazlet on 06.05.31