Clojure sprintf?

Имеется printf. Он печатает непосредственно на stdout.

Как насчет sprintf, который форматирует то же самое, что и printf, но возвращает строку без побочных эффектов?

Ответ 1

В Clojure он называется format и находится в clojure.core: printf эквивалентно (comp print format).

Ответ 2

Вы должны проверить cl-format, в clojure.pprint lib. Это порт Common Lisp FORMAT. Он может делать то, что не может выполнить Java printf, например, условные выражения, итерация по seqs и т.д.

Чтобы ответить на ваш вопрос, cl-format, первый аргумент nil вернет строку; первый аргумент true будет печатать в STDOUT.

user> (cl-format nil "~{~R~^, ~}" [1 2 3 4])
"one, two, three, four"

Обратите внимание, что если format еще не существует в Clojure, вы также можете записать вывод из Clojure printf следующим образом:

user> (with-out-str (printf "%s" :foo))
":foo"

with-out-str полезно, когда библиотека предоставляет только функцию, которая печатает в STDOUT, и вы хотите записать результат. Я использую библиотеки Java, которые это делают.

Ответ 3

Рассмотрим использование макроса with-out-str:

(with-out-str
    (print x))

Или просто вызовите метод java.lang.String format:

(String/format "%d" 3)