SICP 読み (225) 4.3.3 amb 評価器の実装

if とか sequence のあたりから fail だの fail2 だ云々が出てき始めてるんですが、失敗な試験も検討した方が良さげ。てーか、UT というナニを越えてる気がするなぁ。それ以前に試験ドリブンでも無かったりするのも微妙。
大体、今の試験が

  ("if"
   ("simple (consequent)"
    (let ((env (setup-environment)))
      (let ((succeed (lambda (value fail) value))
	    (fail (lambda () 'failed)))
	(assert-equal 1 ((analyze-if '(if true 1 2)) env succeed fail))
	)
      )
    )

みたいなカンジになってて succeed な失敗引数無視だな。やっぱこのあたりは_Procedure applications_なあたりのソレをきちんとサラワないと駄目っぽい。

definition

とりあえず analyze-definition について失敗スルーな試験を。

  ("definition"
   ("simple"
    (let ((env (setup-environment)))
      (let ((succeed (lambda (value fail) value))
	    (fail (lambda () 'failed)))
	(assert-equal 'ok ((analyze-definition
			    '(define x 3)) env succeed fail))
	(assert-equal 3 ((analyze-variable 'x) env succeed fail))
	)
      )
    )
   )

assignment な試験のハードルが高いな。やっぱ単純に失敗、な試験はした方が良いのかなぁ。とりあえず_手続き_と_駆動ループ_なナニまでざくっと済ませた後にきちんとヤる方向で可能であれば assignment について追記予定 (って多分無理

assignment

とりあえず、失敗したら元に戻るのは確認したくなった。で、以下の試験をでっち上げるも通らず。ちょっと何かカン違いしてるはず。日を改めさせて下さひ。

  ("assignment"
   ("fail"
    (let ((env (setup-environment)))
      (let ((succeed (lambda (value fail) value))
	    (fail (lambda () 'failed)))
	(assert-equal 'ok ((analyze-definition
			    '(define x '())) env succeed fail))
	(assert-equal '() ((analyze-variable 'x) env succeed fail))
	(assert-equal 'ok ((analyze-assignment
			    '(set! x 3)) env succeed fail))
	(assert-equal 3 ((analyze-variable 'x) env succeed fail))
	(assert-equal 'failed ((analyze-assignment
				'(set x (amb))) env succeed fail))
	(assert-equal 'failed ((analyze-assignment
				'(set x (amb))) env succeed fail))
	(assert-equal '() ((analyze-variable 'x) env succeed fail))
	)
      )
    )
   )

とほほほ。