我正在构建一个哈希映射列表,然后传递给另一个函数。当我尝试使用map
从列表中打印每个哈希映射时,它无效。我可以打印完整列表或获取第一个元素等。
(defn m [a]
(println a)
(map #(println %) a))
以下仅适用于repl。
(m (map #(hash-map :a %) [1 2 3]))
但是从我使用load-file
加载的程序中,它无效。我看到的是a
,但没有看到它的个别元素。怎么了?
答案 0 :(得分:4)
在Clojure中,转换函数返回一个惰性序列。所以,(map #(println %) a)
返回一个懒惰的序列。使用时,将应用地图操作,然后才能看到打印效果。
如果该功能的目的是产生副作用,例如打印,则需要急切地评估转换。函数dorun和doall
(def a [1 2 3])
(dorun (map #(println %) a))
; returns nil
(doall (map #(println %) a))
; returns the collection
如果您实际上不想映射,但只有副作用,则可以使用doseq。它旨在“重复”。做副作用:
(def a [1 2 3])
(doseq [i a]
(println i))
答案 1 :(得分:4)
如果您的目标只是按顺序调用集合中每个项目的现有函数,忽略返回的值,那么您应该使用run!
:
(run! println [1 2 3])
;; 1
;; 2
;; 3
;;=> nil
在一些更复杂的情况下,最好使用doseq
作为@Gamlor建议,但在这种情况下,doseq
只会添加样板。
答案 2 :(得分:0)
我建议使用尾递归:
(defn printList [a]
(let [head (first a)
tail (rest a)]
(when (not (nil? head))
(println head)
(printList tail))))