Printing a nested data structure in Clojure
Separate impure IO from data transformations


  I wrote the following code which transforms a nested data structure ... into a printable form


Not only does your code transform the data into a printable form, it also prints it.

To better isolate the side effects of printing, you should separate these two operations: first assemble a formatted string, then you can do whatever you want with it -- print it with a single call to println, save it, send it over the network, etc.

(defn format-board
  [board]
  (-&gt;&gt; (board-&gt;icons board)
       (map (partial str/join " "))
       (str/join "\n")))

(def print-board
  (comp println format-board))




doseq

As a side note, instead of (doall (map println seq-to-print)) it is common to see

(doseq [line seq-to-print]
  (println line))


which is usually what you want, since


doseq does not hold onto the return value of println, whereas doall builds up an entire return sequence in memory (important when the sequence is big!) -- which is why your original print-board returns (nil nil nil) instead of nil; and
this makes it more visually clear that you are doing something with each item in the sequence, instead of generating a new sequence with map