【问题标题】:SICP cons-streamSICP 反流
【发布时间】:2014-07-02 10:52:07
【问题描述】:

关于 SICP 3.5

我自己的实现如下

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

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

我的代码有什么问题吗? 或者,如果 print 10...100 是必要的,那么我们可以说结构是 (缺点 10 (延迟 缺点 11(延迟 缺点 12(延迟 ....100))) 如果是这样,那么我们需要更多内存吗?

【问题讨论】:

  • 你也可以使用嘴唇宏(define-macro (delay . exp) `(lambda () ,@exp))

标签: scheme sicp cons


【解决方案1】:

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

要解决这个问题,请将delay 设为宏,就像使用它的任何东西(如cons-stream)一样。以下是您的 delaycons-stream 重新表述为宏:

(define-syntax delay
  (syntax-rules ()
    ((_ exp) (lambda () exp))))

(define-syntax cons-stream
  (syntax-rules ()
    ((_ a b) (cons a (delay b)))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 2019-09-02
    • 2012-07-05
    • 2011-11-05
    • 2017-02-03
    相关资源
    最近更新 更多