2011-06-29 7 views

答えて

3

です:

(loop [i 1] 
    (when (<= i 10) 
    (println i) 
    (recur (inc i)))) 

しかし、それは(続きを読む慣用的だ私はこのような出力がしたい:ただ非常に明確にするために :more "Clojuristic")をmapに、関数printlnを1.10の数値に置き換えます。しかしマップは怠惰なシーケンスを返すので、あなたはforce its evaluation with doallなければなりません:

(doall (map println (range 1 (inc 10)))) 
+4

実際、副作用に関するものであるため、この場合は 'doseq'(または' dotimes')を使用するのがより慣用的です。 'map'は戻り値に興味がある場合にのみ使用してください。それ以外の場合は、怠惰に巻き込まれやすくなります。 – kotarak

+0

だから (dotimes [i 10](println i)) ありがとう!私が14章の「Practical Clojure」(第3章を完成しました):-) – Roger

15

あなたはあなたのようにマップを使用することができ

(doseq [i (range 10)] 
    (println i)) 

、反復は副作用を伴う場合に使用されることを意図され、このためにdoseq使用することができますそれは慣用ではなく、リソースを無駄にするnilsでいっぱいのシーケンスを生成します。また、dosqは怠惰ではありませんので、doallで強制する必要はありません。

+1

に入ると、これは0〜9の数字を出力します。 printlnで(inc i)を使用すると、以下の他の答えに示すように、1から10が得られます。incの代わりに – Roger

+1

(範囲1 11) –

0

そして、ちょうどあなたもマップでそれを行うことができ包括的であることを:dotimesが非であることを

(dotimes [i 10] 
    (println (inc i))) 

注:

(doseq (map #(println %) (range 10)) 
9

私は単純なループのこの種のdotimesを提案-lazyなので、副作用の原因となるprintlnのようなものには良いことです。

0

あなただけの画面に出力を印刷したい場合は、単にあなたの条件を入力する前に(println i)を置くかもしれません:

(loop [i 0] 
    (println i) 
    (if (< i 10) 
    (recur (inc i)) 
    (println "done!"))) 

をし、出力は1行に1つの番号になります。

関連する問題