Reputation:
I am constructing a list of hash maps which is then passed to another function. When I try to print each hash maps from the list using map
it is not working. I am able to print the full list or get the first element etc.
(defn m [a]
(println a)
(map #(println %) a))
The following works from the repl only.
(m (map #(hash-map :a %) [1 2 3]))
But from the program that I load using load-file
it is not working. I am seeing the a
but not its individual elements. What's wrong?
Upvotes: 3
Views: 2350
Reputation: 688
I recommend to use tail recursion:
(defn printList [a]
(let [head (first a)
tail (rest a)]
(when (not (nil? head))
(println head)
(printList tail))))
Upvotes: 0
Reputation: 13304
If your goal is simply to call an existing function on every item in a collection in order, ignoring the returned values, then you should use run!
:
(run! println [1 2 3])
;; 1
;; 2
;; 3
;;=> nil
In some more complicated cases it may be preferable to use doseq
as @Gamlor suggests, but in this case, doseq
only adds boilerplate.
Upvotes: 5
Reputation: 13238
In Clojure tranform functions return a lazy sequence. So, (map #(println %) a)
return a lazy sequence. When consumed, the map action is applied and only then the print-side effect is visible.
If the purpose of the function is to have a side effect, like printing, you need to eagerly evaluate the transformation. The functions dorun and doall
(def a [1 2 3])
(dorun (map #(println %) a))
; returns nil
(doall (map #(println %) a))
; returns the collection
If you actually don't want to map, but only have a side effect, you can use doseq. It is intended to 'iterate' to do side effects:
(def a [1 2 3])
(doseq [i a]
(println i))
Upvotes: 8