【问题标题】:How can i loop through a Collection in Clojure?如何在 Clojure 中循环遍历集合?
【发布时间】:2022-01-10 17:10:03
【问题描述】:

我有一个矩阵,我想打印它的行。 我试图像这样实现它,但我不知道如何循环并获取其他元素!

(defn p! [args]
 (println (first args))
 (drop args))

(p! [[1 2] [3 4]]) --> [1 2]

the output should look like this 
;; 12
;; 34

【问题讨论】:

  • (doseq [row args] (println row))
  • 或者如果你真的想要你发布的确切输出(doseq [row args] (println (clojure.string/join row)))
  • @modar 你学会使用loop了吗?我建议在尝试更复杂的事情之前学习循环使用最简单的示例。
  • (clojure.pprint/cl-format true "~{~{~a~}~%~}" [[1 2] [3 4]]) 可以解决问题)

标签: clojure


【解决方案1】:

我建议使用core.matrix 工具来完成这项任务。它具有成熟且经过时间考验的 API。除此之外,它还为您提供了一个 pm 函数,该函数可以漂亮地打印一个矩阵并接受一个自定义元素 formatter 作为参数。

您可能会发现its implementation 很有趣,因为它可以让您了解打印类似数组的结构。 (TL;DR:它使用递归算法来处理它,该算法大量使用了dotimes fn。)

有了这个库,你最终可能会像这样实现你的p! fn:

(require '[clojure.core.matrix :as mx])

(defn p! [args]
  (mx/pm (mx/matrix args)))

(p! [[1 2] [3 4]])
[[1 2]
 [3 4]]
=> nil

如果您想保持简单和/或省略括号,那么最简单的实现方式如下:

(defn p! [args]
  (doseq [row args]
    (println (clojure.string/join " " row))))

(p! [[1 2] [3 4]])
1 2
3 4
=> nil

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2016-07-16
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多