我正在看一些Fibonacci序列clojure代码的例子:
(def fibs (lazy-cat [1 2] (map + fibs (rest fibs))))
我大体上理解这是怎么回事,但不明白lazy-cat
的意思。我知道lazy-cat
是一个宏,它被转换成这样的东西:
(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs)))))
lazy-seq
到底完成了什么?即使没有lazy-seq
,它仍然会被懒惰地评估?这是严格出于缓存目的吗?
编辑:感谢您的回答。我的困惑是,它与来自REPL的普通concat
一起工作,因为我之前在作用域中绑定了fibs。
发布于 2010-06-01 01:07:14
[1 2]
上的lazy-seq
是不需要的,但并不是很糟糕。
(map + fibs (rest fibs))
上的lazy-seq
是必不可少的;如果没有它,函数调用将在fibs
绑定到值之前进行计算,这将导致异常。通过将其包装在lazy-seq
中,调用将被延迟,直到需要该值,此时fibs
将具有一个值。
发布于 2010-06-01 01:03:15
根据我的理解(我承认我仍然是Clojure的新手!),如果您尝试以下操作:
(def fibs (concat [1 2] (map + fibs (rest fibs))))
那么它就不能工作了,因为fibs还没有被绑定,因此后面对它的两次引用都失败了。
但是,您给出的延迟版本将会起作用,因为对fibs的引用仅在稍后使用序列时才会被实际解析--此时fibs已经被成功定义为lazy序列。
https://stackoverflow.com/questions/2944650
复制相似问题