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

うーん。今日はなんと言えば良いか生産に結びつかない日でした。しかも最後の最後まで駄目とゆー始末。よく見りゃ 200 とゆーキリの良いエントリなんですが、いつものようにとゆーか何とゆーかgdgdッス。

問題 4.34

無限リスト云々以前に印字するためのナニが微妙。とりあえず試験で確認できるな、と言いつつ試験を作ったんですが SIGSEG だそうで。
実際は色々な紆余曲折の挙句だったりするんですが、かいつまんだソレを以下に。

  ("4.34 (2)"
   ("apply"
    (let ((env (setup-environment)))
      (actual-value '(define (xxx x y) (lambda (m) (m x y))) env)
      (actual-value '(define (yyy l) (l (lambda (p q) p))) env)

      (assert-equal 5 (actual-value '((xxx 2 3) +) env))
      (assert-equal 2 (actual-value '(yyy (xxx 2 3)) env))

      ;; SIGSEG ??
;      (assert-equal 2 (actual-value '((xxx 2 3) yyy) env))

      (let ((obj (actual-value '(xxx 2 3) env))
	    (obj2 (actual-value 'yyy env))
	    (obj3 (actual-value '(yyy (xxx 2 3)) env)))

	;; primitive
	(assert-equal 5 (eval-sequence
			 (procedure-body obj)
			 (extend-environment
			  (procedure-parameters obj)
			  (list-of-delayed-args '(+) env)
			  (procedure-environment obj))))

	;; compound (SIGSEG)
	(assert-equal 2 (eval-sequence
			 (procedure-body obj)
			 (extend-environment
			  (procedure-parameters obj)
			  (list-of-delayed-args (list (make-lambda '(p q) '(p))) env)
			  (procedure-environment obj))))
	)
      )
    )
   )

何故に segmentation fault なんでしょうか。フリーソフトウェアだからソース読め、とゆー話なんでしょうが、現時点ではそこまで踏みこめません。仕事でも似たようなナニでどハマってるんですが、出口はどこなんだろう。
ちなみに guile に評価器を吸わせて

(eval-sequence (procedure-body obj)
	       (extend-environment
		(procedure-parameters obj)
		(list-of-delayed-args (list (make-lambda '(p q) '(p))) env)
		(procedure-environment obj)))

を評価させてみたら、(thunk x 以下略) な長いリストが出てきた。何故だ。ってよく考えたら gosh に評価させてないかも。で、gosh に吸わせてみたらやっぱり thunk なリストを出力。SIGSEG は gaunit なのかなぁ。
ちなみに primitive なソレ (実引数が + のやつ) はきちんと値が戻る (gosh)。って force-it すれば良いの? と言いつつ gosh な評価器に吸わせたら (以下略

とほほほ。でもとりあえずこれで印字するための準備はできた模様。次のハードルは無限リストですが、どうすれば良いのか分からん。
cons なリストの car を取り出すには以下でよい模様。

(force-it (eval-sequence
	   (procedure-body obj)
	   (extend-environment
	    (procedure-parameters obj)
	    (list-of-delayed-args (list (make-lambda '(p q) '(p))) env)
	    (procedure-environment obj))))

がしかし、何故に force-it しなければならないか、は確認が必要。この調子で仕事なナニも問題解決してくれる事を切に願いつつ。
# force-it なソレが分かれば追記予定