SICP 読み (176) 4.1.7 構文解析を実行から分離する

4.1.7 節の analyze な手続きを盛り込みつつ動作確認中。ちょっとフライングして問題 4.23 ですがとても面白い。この面白さを何と表現すれば良いやら。
例えば (+ 1 1) みたいな手続き一発だった場合どうなるか、というとこれが analyze されたソレに A という名前を付けたとして procs は '(A) みたいな感じ。
で、analyze-sequence が何を戻すかとゆーと A がそのまんま。Alyssa 製のソレはどうか、とゆーと

  • env を受け取って
  • execute-sequence に '(A) と env を渡して起動

な手続きを戻す。

あるいは

(begin
  (+ 1 2)
  (+ 3 4))

の形だとして (+ 1 2) が analyze されたものに A、(+ 3 4) が analyze されたものに B という名前を付けたとすると Alyssa 製は

  • env を受けとって
  • execute-sequence に '(A B) と env を渡して起動

な手続きを戻すんですが、例示されているソレは

(lambda (env) (A env) (B env))

な手続きを戻す。Alyssa 版は変換が直截的かもしれませんが、変換後なソレは例示されている手続きが戻す手続きが正に直截的。ちなみに以下のようなナニだと

(begin
  (+ 1 2) ;; A
  (+ 2 3) ;; B
  (+ 3 4) ;; C
  (+ 4 5) ;; D
  (+ 5 6) ;; E
  (+ 6 7) ;; F
  )

どんな手続きが戻ってくるか、というと

(lambda (env)
  ((lambda (env)
     ((lambda (env) 
	((lambda (env) 
	   ((lambda (env) (A env) (B env)) env) 
	   (C env)) env)
	(D env)) env)
     (E env)) env)
  (F env))

ってワケワカ。三つくらいにしてみよう。

(lambda (env) ((lambda (env) (A env) (B env)) env) (C env))

うーん。これって execute-application で作成されるフレームの数も少なく済むんだろうな。なかなか凄い。

追記

上記のソレを考えてて、lambda を eval して云々という方面に行ってしまい、困っていたりする事が数度あり。