我對計算機程序的結構和解釋(http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28)第4.3.3節有關於練習4.54的問題。 HTML#%_ sec_4.3.3)。這個練習涉及Amb評估員。SICP練習4.54
行使如下:
如果我們沒有意識到
require
可以作爲使用amb
,由用戶作爲具有不確定性的計劃的一部分來定義一個普通的程序來實現,我們將有必須將其作爲一種特殊形式來實施。這需要語法程序
(define (require? exp) (tagged-list? exp 'require))
(define (require-predicate exp) (cadr exp))
和
analyze
((require? exp) (analyze-require exp))
在調度一個新的條款,以及用於處理
require
表達的過程analyze-require
。完成analyze-require
的以下定義。(define (analyze-require exp) (let ((pproc (analyze (require-predicate exp)))) (lambda (env succeed fail) (pproc env (lambda (pred-value fail2) (if <??> <??> (succeed 'ok fail2))) fail))))
我完成它,如下所示:
(define (analyze-require exp)
(let ((pproc (analyze (require-predicate exp))))
(lambda (env succeed fail)
(pproc env
(lambda (pred-value fail2)
(if (false? pred-value)
(fail2) ;; or (fail)
(succeed 'ok fail2)))
fail))))
我的疑問是:
我知道,在執行過程中,當預測值pred-value
是假的,require
應該失敗;也就是說,它應該調用一個失敗延續程序。但我有點困惑,應該叫(fail)
還是(fail2)
。哪一個是正確的?