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