Scheme SICP中对评价者的矛盾假设
练习1.6使用Scheme SICP中对评价者的矛盾假设,scheme,sicp,Scheme,Sicp,练习1.6使用cond定义新的if: (define (new-if predicate then-clause else-clause) (cond (predicate then-clause) (else else-clause))) 当在递归中调用时,这个newif将落入无限循环 示例sqrt iter说明了一个事实,即参数在传递到用户定义的函数后立即进行求值 3.5中引入的(无限)流也定义为一个函数: (define (cons-stream a b) (co
cond
定义新的if
:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
当在递归中调用时,这个newif
将落入无限循环
示例sqrt iter
说明了一个事实,即参数在传递到用户定义的
函数后立即进行求值
3.5中引入的(无限)流也定义为一个函数:
(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
中相同的求值器,您将无法使其工作,因为(从n开始的整数)
将始终求值(从(+n 1开始的整数))
,显然,无论延迟如何实现,它都没有结束
SICP假设这样的评估器适用于cons-stream
,但不适用于new if
,这是矛盾的吗?:
Cons-stream
是一种特殊形式,定义如下:
(cons-stream <a> <b>)
实际上,您可以将newif
定义为宏,它也可以正常工作:
(define-syntax new-if
(syntax-rules ()
((new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))))
:
Cons-stream
是一种特殊形式,定义如下:
(cons-stream <a> <b>)
实际上,您可以将newif
定义为宏,它也可以正常工作:
(define-syntax new-if
(syntax-rules ()
((new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))))