SICP 読み (223) 4.3.3 amb 評価器の実装
ちょっと試験不足気味ですが先に進む。あと試験ドリブンなソレを止めていたんですが、そろそろきちんとヤラないとまずい。ちょっと体調不良なんで様子を見つつ進めてみる。ってか、中身に目を通さんと。
とりあえず
単純式なソレについて試験をでっち上げてみる。
#!/usr/bin/env gosh
(use test.unit)
(require "ch4-ambeval")
(define-test-suite "amb"
("self-eval"
("1"
(let ((env (setup-environment)))
(let ((succeed (lambda (value fail) value))
(fail (lambda () 'failed)))
(assert-equal 1 ((analyze-self-evaluating 1) env succeed fail))
)
)
)
)
("quoted"
("(quote a)"
(let ((env (setup-environment)))
(let ((succeed (lambda (value fail) value))
(fail (lambda () 'failed)))
(assert-equal 'a ((analyze-quoted '(quote a)) env succeed fail))
)
)
)
)
("variable"
("x"
(let ((env (setup-environment)))
(let ((succeed (lambda (value fail) value))
(fail (lambda () 'failed)))
(eval-definition '(define x 1) env)
(assert-equal '1 ((analyze-variable 'x) env succeed fail))
)
)
)
)
("lambda"
("(lambda () 1)"
(let ((env (setup-environment)))
(let ((succeed (lambda (value fail) value))
(fail (lambda () 'failed)))
(let ((l ((analyze-lambda '(lambda () 1)) env succeed fail)))
(assert-equal 'procedure (car l))
(assert-equal '() (cadr l))
(assert-equal 1 ((caddr l) env succeed fail))
)
)
)
)
)
)lambda は analyze-sequence の試験をしてませんが、ある意味確認のためなんでスルー。analyze されたソレが analyze-lambda が戻すリストの caddr にセットされてる、という事はこれも手続きなんですが、試験な lambda では self-evaluating のみが戻る形、とゆー事で succeed 決めウチな試験をしています。
これは analyze-sequence な試験をして、ざっくり理解した後にきちんとした試験が必要。もう少し内容を精査してみますが、追記があるかどうかは微妙。
定義と代入
やはり試験を作るリキは無い。でも、analyze-if も analyze-sequence もとても面白い。失敗継続を持ち回っているのは分かったのですが、失敗した時にその前の失敗継続とゆーソレをどうやって知るんだろうか。
あと、上手に図示できないんですが、analyze-sequence が最終的に戻す手続きがとても面白い。ちょっとしかイメージできてないのだと思いますが凄い。ただ、実際に手続きが実行される時のナニが (以下略
(a b c d) という並びを評価したソレはこんなカンジでしょうか。
(let ((aa (lambda (env succeed fail)
(a env
(lambda (a-value fail2)
(b env succeed fail2))
fail))))
(let ((cc (lambda (env succeed fail)
(aa env
(lambda (a-value fail2)
(c env succeed fail2))
fail))))
(lambda (env succeed fail)
(cc env
(lambda (a-value fail2)
(d env succeed fail2))
fail))))げ。上記は間違ってるのか、と思ってたらビンゴっぽい。こりゃ凄い。って、まだ全部見えてないのにこんな事言って良いのだろうか。(を