SICP 読み (155) 4.1.2 式の表現

午前中に通院。検査は陰性でした。今日は昨日よりは調子は良いのかもしれませんが、スデに薬で調子悪いのか病気でなのかがワケワカ。
以下、昨晩の続きで問題 4.5 以降の動作確認。ここから先はほぼ実装が済んでいる模様。あまりこのあたりでだらだらヤッてるのもアレなのでとっとと進めよう。

問題 4.5

既に実装が盛り込まれているので試験のみ。

  ("4.5"
   ("example"
    (let ((genv the-global-environment))
      (assert-equal 2 (eval '(cond ((assoc 'b
					   '((a 1) (b 2))) => cadr)
				   (else false))
			    genv))
      )
    )
   )

試験 NG。cadr が基本手続きに入っていない。いくつか追加しておこう。

問題 4.6

let->combination も実装が盛り込み済みな模様。以下を確認 (p.37 より)

  ("4.6"
   ("first"
    (let ((genv the-global-environment))
      (assert-equal 5 (eval '(let ((a 2) (b 3))
			       (+ a b))
			    genv))
      )
    )

   ("2nd"
    (let ((genv the-global-environment))
      (assert-equal 38 (eval '(let ((x 5))
				(+ (let ((x 3))
				     (+ x (* x 10)))
				   x))
			     genv))
      )
    )

   ("3rd"
    (let ((new-env (extend-environment '(x) '(2)
				       the-global-environment)))
      (assert-equal 12 (eval '(let ((x 3)
				    (y (+ x 2)))
				(* x y))
			     new-env))
      )
    )
   )

問題 4.7

let*->nested-let は盛り込まれてるんですが、eval に入ってないので盛り込み。
あと、eval でどうするか、なんですが以前のエントリにある

((let*? exp) (eval (let->combination (let*->nested-let exp)) env))

で試してみようか、と。で以下の試験

  ("4.7"
   ("example"
    (let ((genv the-global-environment))
      (assert-equal 39 (eval '(let* ((x 3)
				     (y (+ x 2))
				     (z (+ x y 5)))
				(* x z))
			     genv))
      )
    )
   )

にはパス。練習問題に出ている

(eval (let*->nested-let exp) env)

だとどうなるか試してみよう。たぶん S 式が戻るはず。

って通ったよ。ちょい簡単に考えスギていたのかなぁ。
これだ、って言ってた解も確かに、ではあるんですが解としては十分、になるのかなぁ。このあたり問題の真意を汲み取りきれていない感じがあるな。

問題 4.8

動作したら OK ってコトにしてるんですが直上の件も含め微妙だなぁ。とりあえず試験を。

   ("example"
    (let ((new-env (extend-environment '() '() the-global-environment)))
      (eval '(define (fib n)
	       (let fib-iter ((a 1)
			      (b 0)
			      (count n))
		 (if (= count 0)
		     b
		     (fib-iter (+ a b) a (- count 1)))))
	    new-env)
      (assert-equal 0 (eval '(fib 0) new-env))
      (assert-equal 1 (eval '(fib 1) new-env))
      (assert-equal 1 (eval '(fib 2) new-env))
      (assert-equal 2 (eval '(fib 3) new-env))
      (assert-equal 3 (eval '(fib 4) new-env))
      (assert-equal 5 (eval '(fib 5) new-env))
      (assert-equal 8 (eval '(fib 6) new-env))
      (assert-equal 13 (eval '(fib 7) new-env))
      )
    )
   )

一応動いてはいる模様。

問題 4.10 の前に

どう評価されていくのか、なナニを整理してみる必要あり、と見て色々確認予定。