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 なソレが分かれば追記予定