Clojure 重复将值从序列映射到参数列表的最佳方法?
对于noob的问题很抱歉,但是有没有一种好方法可以从这样的序列中解构值Clojure 重复将值从序列映射到参数列表的最佳方法?,clojure,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 这正是我想要的,但似乎应该有一种方法可以直接做到这一点
(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
这正是我想要的,但似乎应该有一种方法可以直接做到这一点,而不必指定分区。我找到了一个使用循环/重现的解决方案,但它的代码要多得多,而且显然不惯用。做这件事的好方法是什么?谢谢
(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]
阅读有关销毁的更多信息:使用映射和分区:
(map prn (partition 3 [1 2 3 4 5 6 7 8 9]))
分区+映射是您所需要的全部。了解多伦、多塞克和多尔:
另一种使用循环分解的低级别解决方案: 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 用户=>(def coll[1 2 3 4 5 6 7 8 9 10]) #'用户/coll 用户=>(循环[[a b c&more]coll] 用户=*(当 用户=*(prn a b c) 用户=*(重复更多次))) 1 2 3 4 5 6 7 8 9 10零零零 无
或者在最后一个完整的三元组后,使用c退出。谢谢!我现在明白了,这个特定的问题不算是“解构”,因为输入向量没有结构。分区调用为我创建了要匹配的结构。我希望有一些核心或contrib函数可以完全实现我的“somefunc”想要实现的功能,但它似乎并不存在。递归解决方案看起来相当干净。再次感谢。这和分区和映射是一样的。@edbond自然有不同的方法来解决任何给定的问题。否决票通常意味着答案有根本性的错误,你能详细说明你和我的问题是什么吗?我不喜欢重新实现核心函数,这不是惯用的方法。你可能想使用
分区所有
,而不是分区
,否则,如果集合的长度不能除以3,则会丢失值。
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
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