println 总是返回 nil。你可以使用with-out-str得到你想要的,如下:
(let [ret-val-1 (println "hello") ; (1)
ret-val-2 (with-out-str
(println "hello"))] ; (2)
(println :ret-val-1 ret-val-1)
(println :ret-val-2 ret-val-2))
结果:
-------------------------------
Clojure 1.10.1 Java 13
-------------------------------
Testing tst.demo.core
hello ; printed by (1)
:ret-val-1 nil
:ret-val-2 hello
请注意,(2) 没有输出到终端,因为它已被with-out-str 捕获。
我经常这样做,为此我have a pre-built functionpretty-str:
(ns tst.demo.core
(:use tupelo.core tupelo.test)
(:require
[schema.core :as s]
[clojure.string :as str]))
(def data
{:a "some really big & long string that takes up space over & over "
:b {:c (vec (range 23))
:e (thru 1 10)}})
(def matrix
(forv [ii (range 8)]
(forv [jj (range 12)]
(mod (+ ii jj) 10))))
(dotest
(println :out-1) (println (pretty-str data))
(println :matrix) (println (pretty-str matrix)))
有输出:
:out-1
{:a "some really big & long string that takes up space over & over ",
:b
{:c [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22],
:e [1 2 3 4 5 6 7 8 9 10]}}
:matrix
[[0 1 2 3 4 5 6 7 8 9 0 1]
[1 2 3 4 5 6 7 8 9 0 1 2]
[2 3 4 5 6 7 8 9 0 1 2 3]
[3 4 5 6 7 8 9 0 1 2 3 4]
[4 5 6 7 8 9 0 1 2 3 4 5]
[5 6 7 8 9 0 1 2 3 4 5 6]
[6 7 8 9 0 1 2 3 4 5 6 7]
[7 8 9 0 1 2 3 4 5 6 7 8]]
spyx-pretty 函数更容易使用:
(spyx-pretty matrix)
哪个打印:
matrix =>
[[0 1 2 3 4 5 6 7 8 9 0 1]
[1 2 3 4 5 6 7 8 9 0 1 2]
[2 3 4 5 6 7 8 9 0 1 2 3]
[3 4 5 6 7 8 9 0 1 2 3 4]
[4 5 6 7 8 9 0 1 2 3 4 5]
[5 6 7 8 9 0 1 2 3 4 5 6]
[6 7 8 9 0 1 2 3 4 5 6 7]
[7 8 9 0 1 2 3 4 5 6 7 8]]
spyx 中的x 代表“显式”,因此它会自动打印给出的表达式。完整文档are here。