【问题标题】:Printing out a matrix in Clojure [duplicate]在 Clojure 中打印出一个矩阵 [重复]
【发布时间】:2020-06-19 12:17:47
【问题描述】:

我必须在 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-matrix 的返回值。 现在我已经实现了函数print-matrix如下:

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

在我看来,我在区分如何输出或返回值方面做错了。 谁能帮我为我清除这项任务? :)

【问题讨论】:

  • 只是提一下(它不会解决眼前的问题):您的 REPL 有漂亮的打印机 - 它们将有助于使这样的输出更具可读性

标签: matrix clojure


【解决方案1】:

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

【讨论】:

  • 感谢您对该主题的全面回答!它非常清楚地说明了我对 println 的理解问题及其返回的值。尽管如此,对于我的确切问题,doseq 正在解决问题,因为我想将输出作为副作用来处理。在这种情况下stackoverflow.com/questions/4725417/… 是我的解决方案,我只是不知道最初在哪里搜索。
猜你喜欢
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多