dby*_*rne 17 clojure fibonacci lazy-evaluation infinite-sequence
我正在查看一些示例Fibonacci序列clojure代码:
(def fibs (lazy-cat [1 2] (map + fibs (rest fibs))))
Run Code Online (Sandbox Code Playgroud)
我一般都明白发生了什么,但不明白lazy-cat.我知道这lazy-cat是一个宏,正在翻译成这样的东西:
(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs)))))
Run Code Online (Sandbox Code Playgroud)
究竟是什么lazy-seq实现的?即使没有,它仍会被懒惰地评估lazy-seq?这是否严格用于缓存目的?
编辑:谢谢你的答案.令我感到困惑的是,它与concatREPL中的一个普通模式一起工作,因为我之前已经在范围内绑定了fibs.
小智 16
该lazy-seq上[1 2]是不需要的,但并没有真正受到伤害.
该lazy-seq上(map + fibs (rest fibs))是必不可少的; 如果没有它,函数调用将在fibs绑定到值之前进行求值,这将导致异常.通过将其包装lazy-seq,调用将推迟到需要该值,并且fibs将在该点处具有值.
据我了解(我承认仍然是Clojure的相对新人!),如果您尝试以下内容:
(def fibs (concat [1 2] (map + fibs (rest fibs))))
Run Code Online (Sandbox Code Playgroud)
然后它将无法工作,因为fibs尚未绑定,因此后来对它的两个引用失败.
然而,您提供的惰性版本将起作用,因为对fibs的引用仅在序列被消耗时才实际解析 - 并且此时已将fibs成功定义为延迟序列.