【发布时间】:2012-12-15 20:16:05
【问题描述】:
我对计算机程序的结构和解释第 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))以及处理
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)。哪一个是正确的?
【问题讨论】: