练习1.6定义new-if
cond
:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
在递归中调用时,new-if
会陷入无限循环。
示例sqrt-iter
说明了在传递到user-defined
函数后立即计算参数的事实。
3.5中引入的(无限)stream
也定义了一个函数:
(define (cons-stream a b)
(cons a
(delay b)))
根据教科书,构建它的关键点是delay
。
但是假设你构建了一个流:
(define (intgers-starting-from n)
(cons-stream n
(intgers-starting-from (+ n 1))))
(define integers (intgers-starting-from 1))
使用与new-if
中相同的评估者,您无法使其发挥作用,因为(intgers-starting-from n)
始终会评估(intgers-starting-from (+ n 1))
,显然无论如何delay
{1}}已实施。
SICP假设这样的评估者适用于cons-stream
而不适用于new-if
,这是否自相矛盾?
答案 0 :(得分:4)
Cons-stream
是一个定义的特殊形式(cons-stream <a> <b>)
相当于
(cons <a> (delay <b>))
虽然可以将
stream-car
和stream-cdr
定义为过程,但cons-stream
必须是特殊形式。如果cons-stream
是一个程序,那么,根据我们的评估模型,评估(cons-stream <a> <b>)
会自动导致<b>
被评估,这正是我们不希望发生的事情。出于同样的原因,delay
必须是一种特殊形式,尽管force
可以是普通程序。
根据定义,特殊形式不是程序或功能。因此,您对cons-stream
的定义不正确。
它通常以宏的形式实现:
(define-syntax cons-stream
(syntax-rules ()
((cons-stream a b)
(cons a (delay b)))))
实际上,您可以将new-if
定义为宏,它也可以正常工作:
(define-syntax new-if
(syntax-rules ()
((new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))))