在SiC颗粒利弊流是如何实现的?(how is the sicp cons-stream imple

2019-07-19 02:30发布

我通过上海化学工业区的流部分工作,我被困在如何定义流。

下面是我的代码:

(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))))

如果我定义整数的方式,这本书descibes:

(define (integers-starting-from n)
   (cons-stream n (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))

我得到一个消息说:中止!:最大递归深度超出。

我猜测, 延迟功能无法正常工作,但我不知道如何解决它。 我正在我的Mac麻省理工学院的方案。

更新1

所以,现在有利弊流作为宏,整数可以被定义。

但后来我有另一个错误。

(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以上

Answer 1:

cons-stream需要做个宏,以便您的代码示例正常工作。 否则的调用cons-stream会热切地评估其所有参数。

试试这个(未测试):

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

PS你的delay ,需要做个宏也,出于同样的原因。 然后你修复后delay ,你可以让你的cons-stream使用delay直接。



Answer 2:

你不能定义延迟的功能,因为它调用之前,计划将评估它的参数 - 这是你试图推迟到底是什么。 SICP说,这明确表示,延迟应该是一种特殊形式。



文章来源: how is the sicp cons-stream implemented?
标签: scheme sicp