Matrix 用Clojure打印矩阵

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] (

我必须用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]
    (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正在做这个把戏,因为我想把输出作为副作用来处理。在这种情况下是我的解决方案,我只是不知道在哪里搜索最初。