3
長さが4の場合、ループは5回実行されます。ストリームから5文字を読み込みます。Clojureループは1つを余分に読み込みます
(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)))))
をだから私はゼロのためにループの前に別のテストを追加する必要がありますが、それは5回を実行している理由を私はまだ得ることはありませんか?これはクロージャーの行動ですか、何か不足していますか? –
あなたのバージョンでは、counter = 4、3、2、1、0のときに読み取りが行われます。これは5回の繰り返しです。最初の読み込みはループバインディングベクタ内で行われ、 'i'が最初に設定され、次の4回の読み込みは' recur'によって行われます。あなたが ''ゼロ? 'のために' 'カウンター 'をテストする時までにあなたはすでに1つを読んでしまっています。私が投稿したバージョンは、この問題を回避するif文の中で読み込みを移動します。ループの前に別のテストは必要ありません。 –
あなたの頭の中であなたのループを歩いていくと、5番目の文字がどこから来るのかが分かります。基本的に、ループ内の2つの場所で同じもの(.read stream)を繰り返すことは、コードの匂いです。 – Svante