【问题标题】:SICP: The non-strict or lazy `cons`, how does it work?SICP:非严格或懒惰的“缺点”,它是如何工作的?
【发布时间】:2026-01-15 04:15:01
【问题描述】:

以下摘自 SICP 书,4.2.3 Streams as Lazy Lists 部分:

使用惰性求值,流和列表可以相同,所以有 不需要特殊的表格或单独的列表和流操作。 我们需要做的就是安排事情,使cons 不严格。 实现此目的的一种方法是扩展惰性求值器以允许 对于非严格的原语,并将cons 实现为其中之一。 安 更简单的方法是回忆(第 2.1.3 节)没有基本的 完全需要将cons 实现为原语。相反,我们可以 将对表示为过程:

(define (cons x y)
    (lambda (m) (m x y)))
(define (car z)
    (z (lambda (p q) p)))
(define (cdr z)
    (z (lambda (p q) q)))

问题:我看不出cons 的上述定义如何实现惰性或非严格行为。比如下面对cons的调用,

(define (foo) '(1 2 3))
(define bar (cons 'a (foo)))

确实会导致在调用cons 时调用foo,这是一种非惰性或严格的行为。

那么,我们如何编写一个惰性或非严格版本的cons,它也不是一个特殊形式

【问题讨论】:

  • 本节假定代码由上一节 4.2.2 的惰性求值器求值。
  • 嗯。我有点怀疑你在这里说的是这种情况,但并不完全确定。例如,上面第 4.2.3 节引发了前面第 3.5.1 节中面临的问题,其中特殊形式 delaycons-stream - 作者说 - 必须 必须使用。这听起来好像作者试图在当前第 4.2.3 节中摆脱评估者之外的特殊形式。
  • @molbdnilo 如果您可以将您的评论作为回复重新发布,我会将其定稿。

标签: scheme lazy-evaluation sicp cons


【解决方案1】:

本节假定代码由上一节 4.2.2 的惰性求值器求值。 – molbdnilo,在Mar 2 '17 at 7:49

【讨论】: