首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP cons-stream

SICP cons-stream
EN

Stack Overflow用户
提问于 2014-07-02 18:52:07
回答 1查看 1.7K关注 0票数 3

关于SICP 3.5

我自己的实现如下

代码语言:javascript
复制
(define (delay exp) (lambda () exp))

(define (force delayed-obj)
  (delayed-obj))

(define (cons-stream a b) (cons a (delay b)))

(define (stream-car stream) (car stream))


(define (stream-cdr stream) (force (cdr stream)))

(define (take n stream) 
  (if (= n 0)
      (print "0")
      (begin (take (- n 1) (stream-cdr stream))
             (print n))))

(define (make-stream-enum-interval low high)
  (if (> low high)
      '()
      (begin (print low) (cons-stream low (make-stream-enum-interval (+ low 1) high)))))

实际上,我发现它并没有真正延迟。当我执行(定义range- 10 -to-100 (make-stream-enum-interval 10 100))时。我希望在控制台中只打印出10个。而现在是10...100

我的代码有什么问题吗?或者,如果需要打印10...100,那么我们可以说结构是(cons 10 (delay cons 11 (delay cons 12 (delay ....100)如果是这样,那么我们需要更多的内存?

EN

回答 1

Stack Overflow用户

发布于 2014-07-02 19:09:10

方案使用eager evaluation。这意味着函数调用的所有参数在进入函数之前都要进行计算。因此,由于您的delay是一个函数,传递给delay的表达式将首先计算。

要解决这个问题,就像使用它的任何东西(如cons-stream)一样,将delay设为宏。下面是将delaycons-stream重新定义为宏的方法:

代码语言:javascript
复制
(define-syntax delay
  (syntax-rules ()
    ((_ exp) (lambda () exp))))

(define-syntax cons-stream
  (syntax-rules ()
    ((_ a b) (cons a (delay b)))))
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24529271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档