16

Clojureの「線」のベクトルを反復処理しようとしています。基本的に、次のようになります。

[{:start {:x 1 :y 3 :z 4}, :end {:x 3 :y 7 :z 0}}, ...]

これらの「行」のそれぞれを新しい行alaに出力する関数を適用したいと思います。

(map #(println %) vector-of-lines)

しかし、それは関数を呼び出すようには見えません。この場合、「マップ」関数を使用するべきではありませんか?

4

4 に答える 4

17
(dorun (map println vector-of-lines))

dorunレイジーシーケンスの評価を強制しますが、シーケンス内の各アイテムの個々の結果も破棄します。これは、まさにここで必要な副作用のためだけのシーケンスに最適です。

于 2012-06-01T22:06:33.670 に答える
16

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))
于 2012-06-01T22:33:15.837 に答える
4

ジャスティンの答えに追加するの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
于 2012-06-02T16:54:40.633 に答える
0

Clojure 1.7以降、必要な処理run!を実行するものがあります。このメソッドの名前は、およびの回避策に関連している可能性がdorunありmapます。このような場合の使用には注意してくださいmap。渡した関数内で別の呼び出しを行ったとしmapます。これには、シーケンスもウォークする必要があります。dorunしたがって、 2回使用する必要があります。

于 2020-05-06T15:13:48.013 に答える