问:scheme的stream实现与clojure的lazy-seq有什么异同

scheme实现代码

(define (stream-delay expr)
  (lambda ()
    expr))
(define (stream-force delayed)
  (delayed))

(define (stream-car stream) (car stream))
(define (stream-cdr stream) (stream-force (cdr stream)))
(define (cons-stream a b) (cons a (stream-delay b)))

实现ones流: (1 1 1 1 1 1 1 …)

scheme

(define ones (cons-stream 1 ones))

clojure

(def ones
    (lazy-seq
        (cons 1 ones))

疑问

总想把scheme的stream与clojure的lazy-seq联系起来,两个都用到递归,都是惰性,但只有lazy-seq带缓存,他们的构造看起来不一样
虽然这样,我想知道的是他们之间有没有互通的方面,可不可以用stream来理解lazy-seq

我不了解clojure,但是从行为上看lazy-seq和stream应该是一样的。

你提到lazy-seq带缓存,这个feature用stream也可以实现(我记得sicp里有一个例子,即:所谓mutable一次,不算“mutable”)。

至于lazy-seq的底层实现,你可能需要看一下clojure的实现,它可能是一种语法糖。

lazy seq分三段。 第一个被持有引用的元素之前的元素会被gc回收。 这个元素到访问过的最远的元素是一个list。 没访问过的部分是个迭代器。

你要是用 Scheme 自带的 delay force 也一样是带缓存的

clojure 不清楚,你这个是哪门子的惰性啊。。。