我对计算机程序的结构和解释第 4.3.3 节中的练习 4.54 有疑问 (http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28.html#%_sec_4.3.3 )。此练习涉及 Amb 评估器。
练习如下:
如果我们没有意识到
require
可以将其实现为使用amb
, 由用户定义为非确定性程序的一部分的普通过程,我们将不得不将其实现为特殊形式。这将需要语法过程
(define (require? exp) (tagged-list? exp 'require))
(define (require-predicate exp) (cadr exp))
和调度中的一个新条款
analyze
((require? exp) (analyze-require exp))
以及
analyze-require
处理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)
. 哪一个是正确的?