【问题标题】:Contradictory assumptions on evaluator in SICPSICP中对评估者的矛盾假设
【发布时间】:2015-08-29 03:23:28
【问题描述】:

练习 1.6 定义了一个 new-ifcond

(define (new-if predicate then-clause else-clause)
  (cond (predicate then-clause)
        (else else-clause)))

这个new-if 在递归调用时会陷入无限循环。

示例sqrt-iter 说明了参数在传递到user-defined 函数后立即求值的事实。

3.5中引入的(infinite)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 是如何实现的,它显然没有尽头。

SICP 假设这样的评估器适用于cons-stream 但不适用于new-if,这是否矛盾?

【问题讨论】:

    标签: scheme sicp


    【解决方案1】:

    SICP says:

    Cons-stream 是一种特殊形式,因此

    (cons-stream <a> <b>)
    

    等价于

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

    It also adds:

    虽然stream-carstream-cdr可以定义为过程,但cons-stream必须是特殊形式。如果cons-stream 是一个过程,那么根据我们的评估模型,评估(cons-stream &lt;a&gt; &lt;b&gt;) 将自动导致评估&lt;b&gt;,这正是我们不希望发生的事情。出于同样的原因,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)))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多