【发布时间】: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 节中面临的问题,其中特殊形式
delay和cons-stream- 作者说 - 必须 必须使用。这听起来好像作者试图在当前第 4.2.3 节中摆脱评估者之外的特殊形式。 -
@molbdnilo 如果您可以将您的评论作为回复重新发布,我会将其定稿。
标签: scheme lazy-evaluation sicp cons