我正在研究 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))
我收到一条消息:正在中止!:超出最大递归深度。
我猜delay功能不起作用,但我不知道如何修复它。我正在我的 Mac 上运行 MIT 方案。
update 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
update 2
请忽略update 1 above
cons-stream
需要是一个宏才能使您的示例代码正常工作。否则调用cons-stream
将热切地评估其所有论点。
试试这个(未测试):
(define-syntax cons-stream
(syntax-rules ()
((cons-stream a b)
(cons a (memo-func (lambda () b))))))
附:你的delay
出于类似的原因,也需要是一个宏。然后修复后delay
,你可以让你的cons-stream
use delay
直接地。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)