clojure中的lazy seq有什么意义?
我正在查看一些Fibonacci序列clojure代码示例:clojure中的lazy seq有什么意义?,clojure,lazy-evaluation,fibonacci,infinite-sequence,Clojure,Lazy Evaluation,Fibonacci,Infinite Sequence,我正在查看一些Fibonacci序列clojure代码示例: (def fibs (lazy-cat [1 2] (map + fibs (rest fibs)))) 我基本上了解发生了什么,但不明白懒猫的意思。 我知道,lazy cat是一个正在转换为如下内容的宏: (def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 什么是lazy seq完成的?即使没有lazy seq,它仍然会被惰性地评估
(def fibs (lazy-cat [1 2] (map + fibs (rest fibs))))
我基本上了解发生了什么,但不明白懒猫的意思。
我知道,lazy cat
是一个正在转换为如下内容的宏:
(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs)))))
什么是lazy seq
完成的?即使没有lazy seq
,它仍然会被惰性地评估?这是否严格用于缓存目的
编辑:谢谢你的回答。我的困惑是,它与REPL中的一个普通的concat
一起工作,因为我以前在范围内绑定过fibs。据我所知(我承认我还是Clojure的新手!),如果您尝试以下方法:
(def fibs (concat [1 2] (map + fibs (rest fibs))))
那么它就不起作用了,因为fibs还没有绑定,因此后面的两个引用都失败了
不过,您给出的延迟版本会起作用,因为对FIB的引用只会在以后使用序列时才被实际解析,而此时FIB已经被成功地定义为延迟序列。不需要
[1 2]
上的延迟序列,但实际上并不有害
(map+fibs(rest-fibs))
上的惰性seq
是必不可少的;如果没有它,函数调用将在fibs
绑定到值之前进行计算,这将导致异常。通过将其包装在lazy seq
中,调用将被推迟到需要该值时,并且fibs
将在该点上有一个值