我有一个关于练习4.54的问题,来自4.3.3节“计算机程序的结构和解释”(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表达式的过程require。完成以下analyze-require定义。 (定义(分析-需求exp) (let ((pproc (分析(请求-谓词exp) (lambda (env成功)) (pproc env (lambda (pred-value fail2) (如果成功(Ok Fail2)失败))
我完成了以下工作:
(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为false时,require应该失败;也就是说,它应该调用一个failure延续过程。但是我有点不明白它是应该调用(fail)还是(fail2)。哪一个是对的?
发布于 2012-12-31 23:20:43
(fail2)是正确的。该过程符合续传式,在本例中正确的延续过程是fail2。
发布于 2016-04-09 10:22:23
我认为(fail)是对的。
这里我们得到了pred-value,这意味着pproc现在评估得很好。但是如果它是false值,我们就把它当作pproc计算错误一样糟糕。所以这里的延续是fail而不是fail2。
在这里可以找到一个测试:
发布于 2016-08-29 12:16:05
(fail2)是正确的,嗯,大多数情况下,不管您选择哪一个,都没关系,但是对于以下条件:
1.谓词部分包含(amb),例如
(require (amb false true false true true))
2.谓词部分包含(set!<...> <...>)
您可以检查它,这是因为除了上述两种进程之外,大多数进程的失败延续与调用者的相同。虽然听起来有点荒谬。
https://stackoverflow.com/questions/14105521
复制相似问题