【问题标题】:Scheme, SICP, R5RS, why is delay not a special form?Scheme、SICP、R5RS,为什么延迟不是特殊形式?
【发布时间】:2011-08-02 09:37:36
【问题描述】:

这与 SICP 的第 3.5 章有关,其中正在讨论流。这个想法是:

(cons-stream 1 (display 'hey))

不应评估 cons-stream 的第二部分,因此不应打印“hey”。这确实发生了,我得到以下输出:

嘿(1 .#)

所以我的结论是延迟不是作为一种特殊的形式来实现的?还是我做错了什么?我使用以下实现:

(define (cons-stream a b) 
  (cons a (delay b)))

延迟是默认的 R5RS 实现。这是实施中的错误,还是我没有正确执行或理解它?

【问题讨论】:

    标签: scheme sicp r5rs


    【解决方案1】:

    确实创建了一个promise,但promise 是在您的cons-stream 中创建的,这意味着为时已晚,并且表达式已经被评估。试试这个:

    (define (foo x)
      (display "foo: ") (write x) (newline)
      x)
    
    (cons-stream 1 (foo 2))
    

    您会发现它的评估太早了。出于同样的原因,这个:

    (define ones (cons-stream 1 ones))
    

    当您的 cons-stream 是一个函数时,任何其他无限列表都将不起作用。所以问题是delay 是一个特殊的形式,但你没有使用它的特性,因为你将cons-stream 定义为一个普通函数。如果您想让 it 也以相同的特殊方式运行,则必须将 cons-stream 定义为宏。例如:

    (define-syntax cons-stream
      (syntax-rules ()
        [(cons-stream x y) (cons x (delay y))]))
    

    【讨论】:

    • 谢谢!但是我如何创建一个可以按照书中的方式工作的 cons-stream 呢?
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2015-09-06
    • 2012-09-30
    • 2012-01-03
    相关资源
    最近更新 更多