对SICP评估员的矛盾假设

时间:2015-08-29 03:23:29

标签: scheme sicp

练习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,这是否自相矛盾?

1 个答案:

答案 0 :(得分:4)

SICP says

  

Cons-stream是一个定义的特殊形式

(cons-stream <a> <b>)
     

相当于

(cons <a> (delay <b>))

It also adds

  

虽然可以将stream-carstream-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)))))