Как я могу захватить стандартный вывод clojure? - PullRequest
16 голосов
/ 29 марта 2011

У меня есть несколько printlns, которые мне нужно захватить из программы Clojure, и мне было интересно, как я могу захватить вывод?

Я пробовал:

(binding [a *out*]
    (println "h")
    a
)

: но это не такт работа

Ответы [ 3 ]

34 голосов
/ 29 марта 2011
(with-out-str (println "this should return as a string"))
8 голосов
/ 29 марта 2011

Просто чтобы немного расширить ответ Михеля, когда вы хотите записать вывод в файл, вы можете объединить with-out-str с spit.

Если вы не хотите создавать огромную строку в памяти перед ее записью, вы можете использовать with-out-writer из библиотеки clojure.contrib.io.

with-out-writer - это макрос, который красиво инкапсулирует правильное открытие и закрытие файлового ресурса и привязку устройства записи к этому файлу к *out* при выполнении кода в его теле.

3 голосов
/ 29 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...