SICP 読み (335) 5.5 翻訳系

頭痛いの久々だな。とりあえず問題 5.39 以降に着手。

問題 5.39

環境なソレが微妙。例えば

((lambda (x y)
   (lambda (a b c d e)
     ((lambda (y z) <e1>)
      <e2>
      (+ c d x))))
 3
 4)

なナニが例示されとります。これ、意味分からんぞ、と思ってたんですが上記が戻す_手続きの作用で_という文章を発見。やれやれ成程。てー事は な式を評価する時点の環境は

(((a b c d e) . (実引数なリスト)) ((y z) . (<e2> (+ c d x))) ((x y) . (3 4)))

で良いのでしょうか。これであれば x の文面アドレスなるソレは (2 0) で OK ですが。げ。y は (0 0) で c は (1 2) になってるな。これは上記の式が評価される実際をきちんと確認しないと微妙。
ええと、戻す手続きを作用させる式は例えば以下だな

(((lambda (x y)
    (lambda (a b c d e)
      ((lambda (y z) <e1>)
       <e2>
       (+ c d x))))
  3
  4)
 1 2 3 4 5)

あららら。違うのかな。順に見てみると

  • application 認定で operator な (((lambda (x y) 云々) 3 4) が eval されますが、これも application 認定で ((x y) . (3 4)) な環境が extend されて (lambda (a b c d e) 云々) が戻る
  • 戻った手続きの引数に (1 2 3 4 5) が束縛される形で環境が extend されて中の ((lambda (y z) 云々) (+ c d x)) がナニ。extend された環境は (((a b c d e) . (1 2 3 4 5)) ((x y) . (3 4))) になる
  • 最後に中身の手続きが評価される。

てー事は違う、という事になるか。そーゆー意味では を評価するナニは

(((a b c d e) . (1 2 3 4 5)) ((x y) . (3 4)))

になるのか。これだと例示されているナニとテキストの記述が合致します。これでようやく本題に入るコトができる訳か。とりあえず例示されてるナニを元に試験を書いてみましょうね。って忘れてる可能性が (以下略

試験

まず、gauche な試験を書いてるナニを探すコトから開始。(を
なんとなく書いてみたのが以下

(use gauche.test)

(add-load-path ".")
(load "5.39.scm")

(test-start "5.39")

(test-section "example")
(let ((env (extend-environment 
	    '(y z) 
	    '(1 2)
	    (extend-environment
	     '(a b c d e)
	     '(3 4 5 6 7)
	     (extend-environment
	      '(x y)
	      '(8 9)
	      '())))))
  (test* "x is 8 (2 0)" 8 (lexical-address-lookup '(2 0) env))
  (test* "y is 1 (0 0)" 1 (lexical-address-lookup '(0 0) env))
  (test* "c is 5 (1 2)" 5 (lexical-address-lookup '(1 2) env)))

load するナニが足らんような気がしますが追加で試験を書く必要もあるな。とりあえず元気が続けば本体も書いてみたいと (以下略