[英]Whats the point of lazy-seq in clojure?
我正在看一些斐波那契序列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
使用,因为我以前曾将示波器绑定到范围上。
不需要[1 2]
上的lazy-seq
,但是并没有真正的伤害。
(map + fibs (rest fibs))
上的lazy-seq
是必不可少的; 没有它,函数调用将在fibs
绑定到一个值之前进行评估,这将导致异常。 通过将其包装在lazy-seq
,调用将被推迟到需要该值时为止,而fibs
届时将具有一个值。
据我了解(并且我承认仍然是Clojure的相对新手!),如果您尝试以下操作:
(def fibs (concat [1 2] (map + fibs (rest fibs))))
然后它将无法工作,因为尚未绑定fib,因此以后对其的两次引用都失败了。
但是,您给出的延迟版本将起作用,因为对fibs的引用仅在序列被消耗时才实际解析,并且到那时fib已被成功定义为lazy序列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.