以下是"Clojure的喜悦"摘录:
使用iterate创建可能无限的整数序列时,每次生成新值时打印一个点,然后使用rest或next返回序列的前三个值会发生什么?rest和next之间的区别可以在以下示例中看到:
(def非常懒( - >(迭代#(do(print.)(inc%))1)休息休息)); => ..#'user/very-lazy
(def less-lazy( - >(迭代#(do(print.)(inc%))1)next next next)); => ...#'user/less-lazy
如图所示,下一个版本打印了三个点,而其余版本只打印了两个.当从另一个构建一个懒的seq时,rest不会导致计算(或实现)任何超出它需要的元素; 接下来呢.为了确定seq是否为空,接下来需要检查其中是否至少有一个东西,因此可能导致一个额外的实现.这是一个例子:
(println(first very-lazy)); 0.4
(println(first less-lazy)); 4
这是我在"Cursive IDE"REPL中得到的:
(def very-lazy (-> (iterate #(do (print \.) (inc %)) 1)
rest rest rest))
..=> #'user/very-lazy
(def less-lazy (-> (iterate #(do (print \.) (inc %)) 1)
next next next))
..=> #'user/less-lazy
(println (first very-lazy)) ; .4
.4
=> nil
(println (first less-lazy)) ; 4
.4
=> nil
Run Code Online (Sandbox Code Playgroud)
我想我确实理解了不同行为的解释,但为什么输出在我的REPL中是相同的?
iterate在Clojure 1.7.0中实现了改变.在1.7之前,它是用cons和实现的lazy-seq,它表现出你引用的JoC片段中描述的行为.1.7开始,它在一个专用的方面实现clojure.lang.Iterate类处理rest,并next以同样的方式,所以它的行为是因为你在REPL发现.
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |