Clojure - 函数

时间:2017-04-25 11:03:28

标签: clojure

我有一个功能

(defn x [w]
  (let [[w1 w2 w3] w]
    (println w1)
    (println w2)
    (println w3))) 

如果我调用该函数

(x [[1 1] [2 2] [3 3]])
=> [1 1]
   [2 2]
   [3 3]

这是我所期待的

有没有办法概括这个?在这种情况下,我知道w是一个包含3个向量的向量,所以我知道[w1 w2 w3]如果w是4向量的向量,则最后一个向量不会被设置为任何东西

我想要的是w是n个向量的向量,然后在函数的let中将它们设置为[w1 w2 w3 ... wn]? (注意不一定必须是w1,w2,... wn)

println只是用于调试,因此对函数

并不重要

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

(defn x [ws]
  (dorun (map println ws)))

例如,

(x [[1 1] [2 2] [3 3]])
[1 1]
[2 2]
[3 3]
=> nil
  • map依次将println应用于每个ws,然后返回 nil结果为序列,按需(懒惰)。
  • dorun要求整个序列,丢弃它, 返回nil

如果您想查看序列,请将dorun替换为doall

(defn x [ws]
  (doall (map println ws)))

=> (x [[1 1] [2 2] [3 3]])
[1 1]
[2 2]
[3 3]
=> (nil nil nil)

前者更简洁的替代方案是

(defn x [ws]
  (doseq [w ws] (println w)))

......而后者是

(defn x [ws]
  (for [w ws] (println w)))