SICP 読み (186) 4.2.2 遅延評価の解釈系

SICP のソースが一式入ってるソレが故障中。早目に svn とかに置いときゃ良かった、というのはまさに後の祭り。

問題 4.29

最初は再帰かな、と思っていたんですが例示されてるソレによれば、引数を複数回評価するナニな模様。たとえば直前エントリな

(define (map p l)
  (if (null? l)
      '()
      (cons (p (car l))
	    (map p (cdr l)))))

(map (lambda (x) (* x x)) (list 1 2 3 4 5))

なナニだと p は再帰呼び出しのソレが深くなる毎に thunk なカワが増えていくのではないかな、と。最初はこのあたりの微妙な部分を解決してくれるに違いない、とキメツけてたんですが、例示されている square なソレを見るに違うみたい。(でも、もしかすると違わないかも、とも思っているんですが
現時点では解釈系なソレが無い状態なんで例示なナニを机上で検討したソレとしては、memoize な解釈系では count の値は 1 で memoize でない解釈系では count の値は 2 になるはず。(square (id 10)) の戻りはどちらも違いはないと見てるんですが、ダウトかなぁ。今までのナニだとダウトなんですが、何とか当たってますように (を

追記

ぱっと見ですが、p が map に渡る時点では memoize なナニが盛り込まれたソレでも thunk なカワは被りますが、二重三重になってしまう感じではない様子。ちょっと手動でトレイスするリキがないッス。(て片仮名多いな