重复将序列中的值映射到arg列表的最佳方法?

时间:2010-10-17 16:53:13

标签: clojure

对于noob问题感到抱歉,但有一种很好的方法可以从这样的序列中构造值..

(somefunc [[a b c] [1 2 3 4 5 6 7 8 9]] (prn a b c))

.. a b c被分配值直到序列耗尽并让我调用args上的函数? doseq需要正确大小的分区

(doseq [[a b c] (partition 3 [1 2 3 4 5 6 7 8 9])] (prn a b c))

输出:

1 2 3 4 5 6 7 8 9

这就是我想要的,但似乎应该有一种方法以直接的方式执行此操作,而不必指定分区。我找到了一个loop / recur的解决方案,但它的代码更多,显然不是惯用的。这样做的好方法是什么?谢谢!

5 个答案:

答案 0 :(得分:4)

(defn apply-to-three [f [a b c & xs]]
  (f a b c)
  (when xs
    (recur f xs)))

user=> (apply-to-three prn [1 2 3 4 5 6 7 8 9])
1 2 3
4 5 6
7 8 9
nil

答案 1 :(得分:2)

(defn some-func
  [[a b c & rest :as all]]
  (prn a b c)
  (prn rest)
  (prn all)

user> (some-func [1 2 3 4 5 6 7])
1 2 3
(4 5 6 7)
[1 2 3 4 5 6 7]

了解有关销毁的更多信息:http://java.ociweb.com/mark/clojure/article.html#Destructuring

答案 2 :(得分:2)

使用循环解构的另一种低级解决方案:

user=> (def coll [1 2 3 4 5 6 7 8 9 10])
#'user/coll
user=> (loop [[a b c & more] coll]
user=*   (when a
user=*     (prn a b c)
user=*     (recur more)))
1 2 3
4 5 6
7 8 9
10 nil nil
nil

或使用when c在最后一个完整三元组后退出。

答案 3 :(得分:0)

使用地图和分区:

(map prn (partition 3 [1 2 3 4 5 6 7 8 9]))

答案 4 :(得分:0)

分区+地图就是你所需要的。阅读有关dorun,doseq和doall的信息:http://onclojure.com/2009/03/04/dorun-doseq-doall/

user> (dorun (map #(apply prn %) (partition 3 [1 2 3 4 5 6 7 8 9])))
1 2 3
4 5 6
7 8 9
nil