3

我想知道是否有办法按索引解构向量。基本上,一个可以让我避免的速记:

(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=>
4

1 回答 1

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]

回答关于解构序列的新问题:

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

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

于 2013-05-03T16:55:28.677 回答