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