代码之家  ›  专栏  ›  技术社区  ›  dbyrne

在clojure中lazy seq有什么意义?

  •  17
  • dbyrne  · 技术社区  · 15 年前

    我正在查看一些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 完成?即使没有 惰性SEQ ?这完全是为了缓存吗?

    编辑:谢谢你的回答。我的困惑是它的工作原理是 concat 因为我以前在作用域中绑定了fibs。

    2 回复  |  直到 15 年前
        1
  •  16
  •   Brian    15 年前

    这个 lazy-seq [1 2] 不需要,但不会真正伤害。

    这个 惰性SEQ (map + fibs (rest fibs)) 是必需的;如果没有它,函数调用将在 fibs 绑定到值,这将导致异常。把它包起来 惰性SEQ ,调用将延迟到需要该值为止,并且 小谎 在那一点上会有一个值。

        2
  •  7
  •   mikera    15 年前

    据我所知(我承认我还是Clojure的一个相对新人!),如果尝试以下操作:

    (def fibs (concat [1 2] (map + fibs (rest fibs))))
    

    然后它就不起作用了,因为fibs还没有绑定,因此后来对它的两个引用都失败了。

    但是,您提供的懒惰版本将起作用,因为对fib的引用实际上只在稍后序列被使用时才被解析——此时fib已经被成功地定义为懒惰序列。