Ответ 1
(with-out-str (println "this should return as a string"))
У меня есть некоторые printlns, которые мне нужно захватить из программы Clojure, и мне было интересно, как я могу захватить вывод?
Я пробовал:
(binding [a *out*]
(println "h")
a
)
: но это не работает
(with-out-str (println "this should return as a string"))
Чтобы немного рассказать о Мичиэле, когда вы хотите захватить вывод в файл, вы можете объединить with-out-str
с spit
.
Если вы не хотите создавать огромную строку в памяти перед ее записью, вы можете использовать with-out-writer
в библиотеке clojure.contrib.io
.
with-out-writer
- это макрос, который красиво инкапсулирует правильное открытие и закрытие файлового ресурса и привязку записи в этом файле к *out*
при выполнении кода в его теле.
with-out-str
делает под обложками, поэтому вы можете сравнить его с вашей попыткой:
user=> (macroexpand-1 '(with-out-str (println "output")))
(clojure.core/let [s__4091__auto__ (new java.io.StringWriter)]
(clojure.core/binding [clojure.core/*out* s__4091__auto__]
(println "output")
(clojure.core/str s__4091__auto__)))
Ваш код привязывал существующий стандартный выходной поток к переменной, печатал в этот поток, а затем запрашивал поток для его значения через переменную; однако значение потока было, конечно, не байтами, которые были напечатаны на нем. Таким образом, with-out-str
временно привязывает вновь созданный StringWriter
к *out*
и, наконец, запрашивает строковое значение этого временного писателя.