映射执行副作用的矢量

时间:2012-06-01 21:39:02

标签: clojure

我试图在Clojure中迭代一行“行”。基本上,它看起来像:

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

我想应用一个函数将这些“行”打印到一个新行上,ala:

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

但似乎没有调用该函数。我不应该在这个例子中使用“map”功能吗?

4 个答案:

答案 0 :(得分:16)

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

dorun强制评估延迟序列,但也会丢弃序列中每个项目的各个结果。这非常适合纯粹用于副作用的序列,这正是您想要的。

答案 1 :(得分:15)

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))

答案 2 :(得分:4)

要添加Justin的答案,doseq是一个宏,因此带有宏的所有限制。

我会写一个内部使用foreach的{​​{1}}函数。

doseq

答案 3 :(得分:0)

从Clojure 1.7开始,run!可以满足您的需求。此方法的命名可能与dorunmap的解决方法有关。在这种情况下,请小心使用map。假设您在传入的函数中再次调用map。这也需要遍历该序列。因此,您将需要两次使用dorun