Как печатать на STDERR в Clojure?

Функция println записывается в STDOUT. Как мы можем писать сообщения в STDERR?

(println "Hello, STDOUT!")

Ответ 1

Для этого нет никакой конкретной функции, однако вы можете динамически перестроить переменную, содержащую поток, который println пишет следующим образом:

(println "Hello, STDOUT!")

(binding [*out* *err*]
  (println "Hello, STDERR!"))

В моем REPL цвет указывает поток (красный - STDERR):

enter image description here

Ответ 2

Обычные методы Java работают отлично и будут легко понятны новичками Clojure:

(.println *err* "Hello, STDERR!")

Другой альтернативой, просто для удовольствия, является clojure.java.io/copy:

(require '[clojure.java.io :as cjio])

(cjio/copy "Hello, STDERR!\n" *err*)
(.flush *err*)

Ответ 3

Если вы регистрируетесь, другим вариантом является использование библиотеки журналов, например clojure/tools.logging. Это дает хороший синтаксис:

(require [clojure.tools.logging :as log])
(log/error "There was an error here")

Он также предоставляет некоторые функции форматирования и функции spy, которые похожи на трассировку, но могут предоставляться различные уровни журналов.