通过索引构造向量

Kev*_*vin 3 clojure destructuring

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

(defn f [v]
    (let [x (nth v 4)
          y (nth v 5)]
        (println x y)))
Run Code Online (Sandbox Code Playgroud)

这是我的基本问题:

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=>
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 8

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

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

(let [{x 4 y 5} [0 1 2 3 4 5 6]]
  [x y])
;= [4 5]
Run Code Online (Sandbox Code Playgroud)

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

((fn [{x 4 y 5}] [x y]) [0 1 2 3 4 5 6])
;= [4 5]
Run Code Online (Sandbox Code Playgroud)

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

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

没有办法按索引对seqs进行解构.这是设计使然,因为seqs不适用于需要快速随机访问的应用程序.