灯下 登录
计算机科学 / SICP / 4.3.3 Implementing the Amb Evaluator

Exercise 4.54 · 习题

Exercise 4.54: If we had not realized that
require could be implemented as an ordinary procedure that uses
amb, to be defined by the user as part of a nondeterministic program, we
would have had to implement it as a special form. This would require syntax
procedures

(define (require? exp)
(tagged-list? exp 'require))

(define (require-predicate exp)
(cadr exp))

and a new clause in the dispatch in analyze

((require? exp) (analyze-require exp))

as well the procedure analyze-require that handles require
expressions. Complete the following definition of 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))))

练习 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))))

Racket #lang sicp
(define (require? exp)
 (tagged-list? exp 'require))

(define (require-predicate exp)
 (cadr exp))
Racket #lang sicp
((require? exp) (analyze-require exp))
Racket #lang sicp
(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))))