Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure的乐趣:“rest vs.next”示例在我的REPL中不会产生相同的结果_Clojure - Fatal编程技术网

Clojure的乐趣:“rest vs.next”示例在我的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

以下是《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中得到的内容:

(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少一项惰性。