やった:
user=> (println (for [line (range 1 5)] (str "line=" line)))
そして得た:
(line=1 line=2 line=3 line=4)
line=1 line=2 line=3 line=4
しかし、私はひもとしてだけ欲しかった。どうすればいいですか?
やった:
user=> (println (for [line (range 1 5)] (str "line=" line)))
そして得た:
(line=1 line=2 line=3 line=4)
line=1 line=2 line=3 line=4
しかし、私はひもとしてだけ欲しかった。どうすればいいですか?
「申請」が必要です。
(apply println (for [line (range 1 5)] (str "line=" line)))
あるいは、
(println (apply str (interpose " " (map #(str "line=" %) (range 1 5)))))
これはどうですか。doseq
シーケンスに対して副作用を行うことであり、印刷は副作用です。
(doseq [line (range 1 5)
:let [msg (str "line=" line " ")]]
(print msg))
の代わりに、次のようにapply
使用することもできます。reduce
user> (reduce #(str %1 " line=" %2) "" (range 1 5))
=> " line=1 line=2 line=3 line=4"
reduce
関数は、関数 ( f の場合に呼び出しましょう) 、 「開始値」、およびfの 2 番目の引数として使用されるもののリストを取る関数です。開始値とリストの最初の項目でfを遅延して呼び出し、次にこれが返すものとリストの 2 番目の項目で f を呼び出し、次にこれが返すものとリストの 3 番目の項目でfを呼び出します。リスト内のすべてのアイテムを使い果たしました (というか、怠け者なので、「要求」した場合にのみリスト全体を調べます)。
最初のスペースが気に入らない場合は、すべてをラップすることができますtriml
(最初に行う必要があります(use 'clojure.string)
)。(reduce #(str %1 "line=" %2 " ") (range 1 5))
または、スペースを最後に配置する を行うこともできます。
私の経験では、 で何かを実行できるときはいつでもapply
、 を使用するともう少しエレガントに実行できますreduce
。さらに重要なことは、私の代替手段は通常、私のreduce
代替手段よりも常にapply
高速であるということです。これが常に正しいと保証することはできず、特定の問題について速度テストを行っていません.
編集
私は自分のバージョン ( ) と JohnJ の 2 番目の提案 ( ) を使用して大まかなタイミングをreduce
調べましapply
た。(range 1 100)
(range 1 500)
apply