Loops Clojure循环读取一个额外的
当长度为4时,以下循环执行5次。从流中读取5个字符Loops Clojure循环读取一个额外的,loops,clojure,stream,lisp,Loops,Clojure,Stream,Lisp,当长度为4时,以下循环执行5次。从流中读取5个字符 (loop [i (.read stream) result "" counter length] (let [c (char i)] (println "=>" c) (if (zero? counter) result (recur (.read stream) (str result c) (dec counter))))) 我不知道clojure,但在我看来,您正在
(loop [i (.read stream) result "" counter length]
(let [c (char i)]
(println "=>" c)
(if (zero? counter)
result
(recur (.read stream) (str result c) (dec counter)))))
我不知道clojure,但在我看来,您正在以“结果”形式再次读取流,这是CL中的最终结果吗?在执行
读取之前,您应该测试零?
。请注意,您的版本将调用read
一次,即使length
==0开始
(loop [result "" counter length]
(if (zero? counter)
result
(let [c (char (.read stream))]
(println "=>" c )
(recur (str result c) (dec counter)))))
另一种避免显式循环的方法是:
(apply str
(take length
(repeatedly #(let [c (char (.read stream))]
(println "=>" c) c)))))
所以我应该在零循环之前添加另一个测试,但我仍然不明白为什么它运行了5次?这是clojure行为还是我遗漏了什么?当计数器=4,3,2,1,0时,您的版本执行读取。这是五次迭代。第一次读取是在循环绑定向量内部完成的,以最初设置i
,接下来的四次读取是通过recur
完成的。当您测试计数器是否为零?
时,您已经做了一次读取过多。我发布的版本在if语句中移动了read,从而避免了这个问题。在循环之前,你不需要再做一次测试。在你的头脑中,通过你的循环,你会看到第五个字符来自哪里。基本上,在循环中的两个位置重复相同的内容(.read stream)是一种代码味道。