对于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的解决方案,但它的代码更多,显然不是惯用的。这样做的好方法是什么?谢谢!
答案 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