通过索引构造向量

时间:2013-05-03 16:53:29

标签: clojure destructuring

我想知道是否有办法通过索引来构造向量。基本上,这是一种允许我避免的简写:

(defn f [v]
    (let [x (nth v 4)
          y (nth v 5)]
        (println x y)))

这是我的基本问题:

user=> (defn f [{x 4 y 5}] (println x y))
#'user/f
user=> (f [0 1 2 3 4 5 6])
4 5
nil
user=> (f (apply vector (range 10)))
4 5
nil
user=> (f (range 10))
5 nil
nil
user=>

1 个答案:

答案 0 :(得分:8)

回答关于解构向量的原始问题:

向量是关联的,因此您可以使用关联解构:

(let [{x 4 y 5} [0 1 2 3 4 5 6]]
  [x y])
;= [4 5]

回应下面的评论,这适用于任何解构表单的工作,包括在fn参数列表中:

((fn [{x 4 y 5}] [x y]) [0 1 2 3 4 5 6])
;= [4 5]

回答有关解构seqs的新问题:

如果将seq传递给上面定义的函数代替向量,则将应用seqs的关联解构规则。也就是说,seq将首先被倒入哈希映射 - (range 10)在此阶段变为{0 1 2 3 4 5 6 7 8 9} - 然后这个哈希映射将被解构为地图。

无法通过索引对seq进行解构。这是设计使然,因为seqs不适用于需要快速随机访问的应用程序。