如何使用clojure中的map函数打印哈希映射列表的每个元素?

2 clojure hashmap

我正在构建一个哈希映射列表,然后将其传递给另一个函数。当我尝试使用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但不是它的单个元素。怎么了?

Gam*_*lor 7

在 Clojure 中,转换函数返回一个惰性序列。所以,(map #(println %) a)返回一个惰性序列。使用时,会应用贴图操作,然后才可以看到打印效果。

如果函数的目的是产生副作用,比如打印,你需要急切地评估转换。函数dorundoall

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


Sam*_*tep 5

如果您的目标只是按顺序对集合中的每个项目调用现有函数,而忽略返回值,那么您应该使用run!

(run! println [1 2 3])
;; 1
;; 2
;; 3
;;=> nil
Run Code Online (Sandbox Code Playgroud)

在一些更复杂的情况下,最doseq好像@Gamlor 建议的那样使用,但在这种情况下,doseq只添加样板。