Clojure的乐趣:“rest vs.next”示例在我的REPL中不会产生相同的结果
以下是《Clojure的欢乐》的摘录: 当您使用 迭代,每次生成新值时打印一个点,然后使用 rest或next返回序列的前三个值?两者的区别 在以下示例中可以看到rest和next: def very lazy->iterate do print。公司%1 休息 ;=> ..'用户/非常懒 def less lazy->iterate do print。公司%1 下一个 ;=> ...'用户/不那么懒惰 如图所示,下一个版本打印了三个点,而其余版本只打印了三个点 二从另一个生成惰性seq时,rest不会导致 或者实现比需要更多的元素;下一个是。为了确定 seq是否为空,next需要检查seq中是否至少有一个内容 这可能会导致一个额外的实现。下面是一个例子: println首先非常懒惰。四, 先别那么懒;四, 以下是我在草书IDE REPL中得到的内容:Clojure的乐趣:“rest vs.next”示例在我的REPL中不会产生相同的结果,clojure,Clojure,以下是《Clojure的欢乐》的摘录: 当您使用 迭代,每次生成新值时打印一个点,然后使用 rest或next返回序列的前三个值?两者的区别 在以下示例中可以看到rest和next: def very lazy->iterate do print。公司%1 休息 ;=> ..'用户/非常懒 def less lazy->iterate do print。公司%1 下一个 ;=> ...'用户/不那么懒惰 如图所示,下一个版本打印了三个点,而其余版本只打印了三个点 二从另一个生成惰性seq时,re
(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
我想我确实理解对不同行为的解释,但为什么我的REPL中的输出是相同的?在Clojure 1.7.0中,iterate的实现发生了变化。在1.7之前,它是根据cons和lazy-seq实现的,它展示了您引用的JoC片段中描述的行为。从1.7开始,它是通过一个专用的clojure.lang.Iterate类实现的,该类以相同的方式处理rest和next,因此它的行为与您在REPL上发现的一样
iterate的实现在Clojure 1.7.0中发生了变化。在1.7之前,它是根据cons和lazy-seq实现的,它展示了您引用的JoC片段中描述的行为。从1.7开始,它是通过一个专用的clojure.lang.Iterate类实现的,该类以相同的方式处理rest和next,因此它的行为与您在REPL上发现的一样
FWIW,我在直接控制台lein repl中也得到了相同的行为。FWIW,我在直接控制台lein repl中也得到了相同的行为。迭代函数中的此更改是否否定了书中该部分中的建议,在使用惰性seq主体中的序列时始终使用rest-over-next?我认为该建议会有效,因为next仍然比rest少一项惰性。迭代函数中的这一变化会否定书中该部分中的建议吗,在惰性seq的主体中使用序列时,总是使用rest-over-next吗?我认为这个建议是站得住脚的,因为next仍然比rest少一项惰性。