SICP 読み (226) 4.3.3 amb 評価器の実装
継続をどうやって持ち回っているんだろうか。頭がコンガラがってますよ。もう少しソース読んでみます。
続
えーと、amb な評価器で試してみた所、
;;; Amb-Eval input: (define x (amb 1 2 3)) ;;; Starting a new problem ;;; Amb-Eval value: ok ;;; Amb-Eval input: x ;;; Starting a new problem ;;; Amb-Eval value: 1 ;;; Amb-Eval input: (amb) ;;; Starting a new problem ;;; There are no more values of (amb) ;;; Amb-Eval input: x ;;; Starting a new problem ;;; Amb-Eval value: 1 ;;; Amb-Eval input:
これって ambeval に渡す一連の手続き群の中で継続の持ち回り、なのか。いや、こうしたら try-again できるな。
;;; Amb-Eval input: (list (amb 1 2 3) (amb 1 2 3)) ;;; Starting a new problem ;;; Amb-Eval value: (1 1) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: (1 2) ;;; Amb-Eval input:
何が違うのだ、と。
続々
driver-loop をニラんでたら見つけた。失敗な継続を internal-loop に渡している。どんな試験書けば良いのだろうか。それとも試験って不可能??
続続々
成功な継続で assert すりゃ良いのだろうか。
("success continuation" (let ((env (setup-environment))) (assert-equal 'ok ((analyze-definition '(define x '())) env (lambda (v f) v) (lambda () 'failed))) (assert-equal '() ((analyze 'x) env (lambda (v f) v) (lambda () 'failed))) (let ((success (lambda (val next-alt) (assert-equal 'ok val) (assert-equal 3 ((analyze 'x) env (lambda (v f) v) (lambda () 'failed))) (next-alt) (assert-equal '() ((analyze 'x) env (lambda (v f) v) (lambda () 'failed)))))) ((analyze-assignment '(set! x 3)) env success (lambda () 'failed)) ) ) )
試験にはパスしている模様。でも試験見ただけでは意味不明かなぁ。複数のセットが巻き戻るナニはどうなってるのだろうか。これは次の_Procedure applications_の項で確認した方が良さげかも。