我正在利用晚上的空闲时间学习《编程向导书》的结构和解释。一切都很顺利,直到我在第三章尝试实现流。我使用的是(Dr)Racket,而不是Scheme,所以这可能是我的问题。
问题的症结在于,当我尝试创建流时,出现内存问题:“交互已禁用;内存不足”。这对我来说表明我使用延迟的方式有问题。提前感谢您的任何建议:)
我已经尝试了文中建议的代码:
#lang racket
(define (cons-stream a b)
(cons a (delay b)))
(define (car-stream s)
(car s))
(define (cdr-stream s)
(force (cdr s)))
我称之为 Racket 的延迟和力量。我也尝试过实现延迟并强迫自己遵循文本,但我遇到了相同的内存错误。为了测试这一切是否有效,我尝试编写无限的 1 流:
(define (ones) (cons-stream 1 (ones)))
并且间隔非常大:
(define (interval low high)
(if (> low high)
null
(cons-stream low
(interval (+ low 1) high))))
(define (first-integers n)
(interval 0 n))
(define test-interval
(first-integers 10000000000000000000000000))
根据我对文本的理解,这些都不会引起问题,因为我们只在需要时生成流。然而,我所做的事情导致了内存问题,所以我认为代码尝试生成整个流!
(define (cons-stream a b)
(cons a (delay b)))
因为 define
创建了一个函数
cons-stream
,因此在每个函数调用中,所有参数都将在调用之前进行评估。这违背了整个目的——
b
将已经被评估。另请参阅
延迟是如何实现的?.