2009-06-28 13 views

答えて

3

readを実行する前に、zero?をテストする必要があります。あなたのバージョンはlength == 0で始まる場合でも、readを一度呼び出します。

(loop [result "" counter length] 
    (if (zero? counter) 
    result 
    (let [c (char (.read stream))] 
     (println "=>" c) 
     (recur (str result c) (dec counter))))) 

明示loopを避けるもう一つの方法:

(apply str 
     (take length 
      (repeatedly #(let [c (char (.read stream))] 
          (println "=>" c) c))))) 
+0

をだから私はゼロのためにループの前に別のテストを追加する必要がありますが、それは5回を実行している理由を私はまだ得ることはありませんか?これはクロージャーの行動ですか、何か不足していますか? –

+1

あなたのバージョンでは、counter = 4、3、2、1、0のときに読み取りが行われます。これは5回の繰り返しです。最初の読み込みはループバインディングベクタ内で行われ、 'i'が最初に設定され、次の4回の読み込みは' recur'によって行われます。あなたが ''ゼロ? 'のために' 'カウンター 'をテストする時までにあなたはすでに1つを読んでしまっています。私が投稿したバージョンは、この問題を回避するif文の中で読み込みを移動します。ループの前に別のテストは必要ありません。 –

+0

あなたの頭の中であなたのループを歩いていくと、5番目の文字がどこから来るのかが分かります。基本的に、ループ内の2つの場所で同じもの(.read stream)を繰り返すことは、コードの匂いです。 – Svante

0

私はClojureのを知っていませんが、「結果」の形で再び流れを読んでいるように、それは私には見えますが、これはCLで決勝のようなものですか?

関連する問題