Matrix 用Clojure打印矩阵
我必须用clojure打印出一个给定的矩阵。目标是在IO中输出矩阵,但返回值只有nil 以下是一个例子:Matrix 用Clojure打印矩阵,matrix,clojure,Matrix,Clojure,我必须用clojure打印出一个给定的矩阵。目标是在IO中输出矩阵,但返回值只有nil 以下是一个例子: (def em [[1 0 0] [0 1 0] [0 0 1]]) (print-matrix em) => 1 0 0 0 1 0 0 0 1 nil 在上面的例子中,输出应该是矩阵,nil应该是函数print矩阵的返回值。 目前,我已经实现了打印矩阵功能,如下所示: (defn print-matrix [coll] (for [row coll] (
(def em [[1 0 0] [0 1 0] [0 0 1]])
(print-matrix em)
=> 1 0 0
0 1 0
0 0 1
nil
在上面的例子中,输出应该是矩阵,nil应该是函数print矩阵的返回值。
目前,我已经实现了打印矩阵功能,如下所示:
(defn print-matrix [coll]
(for [row coll]
(println
(apply str
(interpose " " row)))))
尽管如此,我没有任何输出,但返回值如下:
1 0 0 1
0 1 0 1
0 0 1 1
(nil nil nil)
在我看来,我在区分如何输出或返回值方面犯了一些错误。
有人能帮我把这个任务弄清楚吗 println总是返回nil。您可以通过使用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捕获
我经常这样做,因此我为此目的:
(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 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代表explicit,因此它会自动打印给定的表达式。完整文档。仅提一下,它并不能解决眼前的问题:有漂亮的打印机可供您的REPL使用-它们将有助于使这样的输出更易于阅读感谢您对该主题的全面回答!它非常清楚地说明了我对println的理解问题以及它返回的值。然而,对于我的确切问题,doseq正在做这个把戏,因为我想把输出作为副作用来处理。在这种情况下是我的解决方案,我只是不知道在哪里搜索最初。