Clojureの「線」のベクトルを反復処理しようとしています。基本的に、次のようになります。
[{:start {:x 1 :y 3 :z 4}, :end {:x 3 :y 7 :z 0}}, ...]
これらの「行」のそれぞれを新しい行alaに出力する関数を適用したいと思います。
(map #(println %) vector-of-lines)
しかし、それは関数を呼び出すようには見えません。この場合、「マップ」関数を使用するべきではありませんか?
Clojureの「線」のベクトルを反復処理しようとしています。基本的に、次のようになります。
[{:start {:x 1 :y 3 :z 4}, :end {:x 3 :y 7 :z 0}}, ...]
これらの「行」のそれぞれを新しい行alaに出力する関数を適用したいと思います。
(map #(println %) vector-of-lines)
しかし、それは関数を呼び出すようには見えません。この場合、「マップ」関数を使用するべきではありませんか?
(dorun (map println vector-of-lines))
dorun
レイジーシーケンスの評価を強制しますが、シーケンス内の各アイテムの個々の結果も破棄します。これは、まさにここで必要な副作用のためだけのシーケンスに最適です。
map
怠惰で、あなたがそれらを求めない限り、結果を実現しません。シーケンス内の各要素に対して副作用を実行し、戻り値を気にしない場合は、次を使用しますdoseq
。
;; returns nil, prints each line
(doseq [line vector-of-lines]
(println line))
戻り値が気になる場合は、次を使用して(doall)
ください。
;; returns a sequence of nils, prints each line
(doall (map println vector-of-lines))
ジャスティンの答えに追加するのdoseq
はマクロであり、したがってマクロのすべての制限があります。
foreach
内部でを使用する関数を記述しますdoseq
。
user=> (defn foreach [f xs] (doseq [x xs] (f x)))
#'user/foreach
user=> (foreach println [11 690 3 45])
11
690
3
45
nil
Clojure 1.7以降、必要な処理run!
を実行するものがあります。このメソッドの名前は、およびの回避策に関連している可能性がdorun
ありmap
ます。このような場合の使用には注意してくださいmap
。渡した関数内で別の呼び出しを行ったとしmap
ます。これには、シーケンスもウォークする必要があります。dorun
したがって、 2回使用する必要があります。