gpt4 book ai didi

scheme - sicp cons-stream 是如何实现的?

转载 作者:行者123 更新时间:2023-12-04 18:45:50 27 4
gpt4 key购买 nike

我正在研究 scip 的流部分,并坚持如何定义流。

以下是我的代码:

(define (memo-func function)
(let ((already-run? false)
(result false))
(lambda ()
(if (not already-run?)
(begin (set! result (function))
(set! already-run? true)
result)
result))))


(define (delay exp)
(memo-func (lambda () exp)))

(define (force function)
(function))

(define the-empty-stream '())
(define (stream-null? stream) (null? stream))
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))

(define (cons-stream a b) (cons a (memo-func (lambda () b))))

如果我按照本书描述的方式定义整数:
(define (integers-starting-from n)
(cons-stream n (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))

我收到一条消息:正在中止!:超出最大递归深度。

我猜延迟功能不起作用,但我不知道如何修复它。我正在我的 Mac 上运行 MIT 计划。

更新 1

所以现在使用 cons-stream 作为宏,可以定义整数。

但后来我又犯了一个错误。
(define (stream-take n s)
(cond ((or (stream-null? s)
(= n 0)) the-empty-stream)
(else (cons-stream (stream-car s)
(stream-take (- n 1) (stream-cdr s))))))

(stream-take 10 integers)
;ERROR - Variable reference to a syntactic keyword: cons-stream

更新 2

请忽略上面的更新 1

最佳答案

cons-stream需要是一个宏才能让您的示例代码正常工作。否则调用 cons-stream将热切地评估其所有论点。

试试这个(未测试):

(define-syntax cons-stream
(syntax-rules ()
((cons-stream a b)
(cons a (memo-func (lambda () b))))))

附言您的 delay出于类似的原因,也需要是一个宏。然后在你修复之后 delay ,您可以制作您的 cons-stream使用 delay直接地。

关于scheme - sicp cons-stream 是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14640833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com