Как я могу записать стандартный вывод clojure?

У меня есть некоторые 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 делает под обложками, поэтому вы можете сравнить его с вашей попыткой:
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* и, наконец, запрашивает строковое значение этого временного писателя.