我试图在Clojure中迭代一行“行”。基本上,它看起来像:
[{:start {:x 1 :y 3 :z 4}, :end {:x 3 :y 7 :z 0}}, ...]
我想应用一个函数将这些“行”打印到一个新行上,ala:
(map #(println %) vector-of-lines)
但似乎没有调用该函数。我不应该在这个例子中使用“map”功能吗?
答案 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!
可以满足您的需求。此方法的命名可能与dorun
和map
的解决方法有关。在这种情况下,请小心使用map
。假设您在传入的函数中再次调用map
。这也需要遍历该序列。因此,您将需要两次使用dorun
。