灯下 登录
计算机科学 / SICP / 4.1.6 Internal Definitions

Exercise 4.18 · 习题

Exercise 4.18: Consider an alternative strategy
for scanning out definitions that translates the example in the text to

(lambda ⟨vars⟩
(let ((u '*unassigned*)
(v '*unassigned*))
(let ((a ⟨e1⟩)
(b ⟨e2⟩))
(set! u a)
(set! v b))
⟨e3⟩))

Here a and b are meant to represent new variable names, created
by the interpreter, that do not appear in the user’s program. Consider the
solve procedure from 3.5.4:

(define (solve f y0 dt)
(define y (integral (delay dy) y0 dt))
(define dy (stream-map f y))
y)

Will this procedure work if internal definitions are scanned out as shown in

this exercise? What if they are scanned out as shown in the text? Explain.

练习 4.18:考虑一种扫描出定义的替代策略,它将正文中的示例变换为

(lambda ⟨vars⟩
(let ((u '*unassigned*)
(v '*unassigned*))
(let ((a ⟨e1⟩)
(b ⟨e2⟩))
(set! u a)
(set! v b))
⟨e3⟩))

这里 a 和 b 表示解释器创建的新变量名,它们不出现在用户程序中。考虑 3.5.4 中的 solve 过程:

(define (solve f y0 dt)
(define y (integral (delay dy) y0 dt))
(define dy (stream-map f y))
y)

如果内部定义按本练习所示方式扫描出,这个过程能正常工作吗?如果按正文中所示方式扫描出呢?请解释。

Racket #lang sicp
(lambda ⟨vars⟩
 (let ((u '*unassigned*)
 (v '*unassigned*))
 (let ((a ⟨e1⟩)
 (b ⟨e2⟩))
 (set! u a)
 (set! v b))
 ⟨e3⟩))
Racket #lang sicp
(define (solve f y0 dt)
 (define y (integral (delay dy) y0 dt))
 (define dy (stream-map f y))
 y)