Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Loops Clojure循环读取一个额外的_Loops_Clojure_Stream_Lisp - Fatal编程技术网

Loops Clojure循环读取一个额外的

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,但在我看来,您正在

当长度为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,但在我看来,您正在以“结果”形式再次读取流,这是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)是一种代码味道。