Вы можете использовать cl-format для обработки списка (и списка списка в данном случае) со строкой управления:
(def input
[["+" "+" "+" "#" "!" "-" "#" "#" "#" "-" "-" "-" "-"]
["!" "#" "+" "+" "+" "#" "+" "+" "+" "-" "#" "#" "-"]
["#" "#" "#" "#" "+" "#" "+" "#" "+" "#" "-" "#" "#"]
["+" "+" "+" "#" "+" "+" "+" "#" "+" "#" "-" "-" "-"]
["+" "#" "+" "#" "#" "#" "#" "+" "+" "-" "#" "#" "-"]
["+" "#" "+" "+" "+" "+" "+" "+" "#" "-" "-" "-" "-"]
["+" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"]
["+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "@"]])
(use 'clojure.pprint)
(cl-format *out* "~{~{~a~}~%~}" input)
Выход:
+++#!-###----
!#+++#+++-##-
####+#+#+#-##
+++#+++#+#---
+#+####++-##-
+#++++++#----
+############
++++++++++++@
Пояснение:
~a
- аргумент формата любого типа. Если заключено в ~{
и ~}
, аргумент формата будет повторяться в списке. Поэтому, когда они заключены в два раза с ~{
и ~}
, ~a
будет применен к каждому элементу (символу) во вложенном списке. ~%
перед последним ~}
- вывод новой строки.
При этом вы можете легко изменить вывод с помощью управляющей строки. Например:
(cl-format *out* "~{~{(~a)~^ ~}~^~%~%~}" input)
(+) (+) (+) (#) (!) (-) (#) (#) (#) (-) (-) (-) (-)
(!) (#) (+) (+) (+) (#) (+) (+) (+) (-) (#) (#) (-)
(#) (#) (#) (#) (+) (#) (+) (#) (+) (#) (-) (#) (#)
(+) (+) (+) (#) (+) (+) (+) (#) (+) (#) (-) (-) (-)
(+) (#) (+) (#) (#) (#) (#) (+) (+) (-) (#) (#) (-)
(+) (#) (+) (+) (+) (+) (+) (+) (#) (-) (-) (-) (-)
(+) (#) (#) (#) (#) (#) (#) (#) (#) (#) (#) (#) (#)
(+) (+) (+) (+) (+) (+) (+) (+) (+) (+) (+) (+) (@)
Обратите внимание, что "~^
" - это директива, чтобы остановить итерацию, когда список заканчивается. Поэтому «~^<space>
» будет подавлять пробел после последнего элемента в каждой строке. И "~^~%~%
" будет подавлять двойной перевод строки после последней строки.