Вам необходимо quote
структуру до получения строкового представления:
(list 'quote foo)
где foo
- это структура.
Три дополнительных замечания:
обход кода для цитирования всех списков / секвенций вообще не будет выполняться, поскольку форма (defn ...)
верхнего уровня также будет заключена в кавычки;
списки - не единственный потенциально проблемный тип - это еще один символ (+
против #<core$_PLUS_ clojure.core$_PLUS_@451ef443>
);
вместо использования (str foo)
(даже с foo
уже в кавычках), вы, вероятно, захотите распечатать цитированный foo
- или, скорее, весь кодовый блок с foo
в кавычках внутри - используя pr
/ prn
.
Последний пункт требует короткого обсуждения. pr
явно обещает создать читаемое представление, если *print-readably*
равно true
, тогда как str
создает такое представление только для составных структур данных Clojure «случайно» (реализации) и все еще только если *print-readably*
is true
:
(str ["asdf"])
; => "[\"asdf\"]"
(binding [*print-readably* false]
(str ["asdf"]))
; => "[asdf]"
Вышеупомянутое поведение обусловлено clojure.lang.RT/printString
(это то, что структуры данных Clojure в конечном итоге делегируют свои toString
потребности) в использовании clojure.lang.RT/print
, который, в свою очередь, выбирает формат вывода в зависимости от значения *print-readably*
.
Даже если *print-readably*
привязан к true
, str
может привести к выходу, не подходящему для потребления clojure.lang.Reader
: например, (str "asdf")
- это просто "asdf"
, а читаемое представление - "\"asdf\""
. Используйте (with-out-str (pr foo))
, чтобы получить строковый объект, содержащий представление foo
, гарантированно читаемое, если *print-readably*
равно true
.