関数型言語の勉強に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で束縛されている変数を参照します。


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404