Clojure数据结构函数

Clojure数据结构函数,clojure,Clojure,我是Clojure的新手,正在努力学习基础知识。有一件事让我大吃一惊,那就是理解数据结构和它们使用的函数之间的相关性 例如,如果我创建一个新向量: (def my-vec [1 2 3]) 然后,当我尝试调用我的vec时: (my-vec) 我得到: ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity (AFn.java:437) 我知道我可以传递一

我是Clojure的新手,正在努力学习基础知识。有一件事让我大吃一惊,那就是理解数据结构和它们使用的函数之间的相关性

例如,如果我创建一个新向量:

(def my-vec [1 2 3])
然后,当我尝试调用我的vec时:

(my-vec)
我得到:

ArityException Wrong number of args (0) passed to: PersistentVector  clojure.lang.AFn.throwArity (AFn.java:437)
我知道我可以传递一个参数,它似乎在调用
get
,但我怎么知道呢?
PersistentVector
使用什么参数?在哪里可以找到关于它的文档

我试过:

(doc PersistentVector)

但是它返回的
nil
我的vec
不是一个函数,所以你应该调用:
我的vec
不是
(我的vec)

尝试:
(nth my vec i)
获取此向量的第i个元素


链接:

如果将数字传递给Clojure向量,该向量将使用该数字作为其自身的索引,并返回该索引处的值:

user> (def my-vec [1 2 3 4 5])
#'user/my-vec
user> (my-vec 2)
3
这允许您编写这样的表达式,从vec中获取多个键

user> (map my-vec [1 3 4])
(2 4 5)

文档可在IPersistentVector下找到,如下所示:

特别是:
向量实现IFn,用于一个参数的invoke(),它们假定该参数是一个索引,并在自身中查找,就好像在第N步一样,即向量是其索引的函数。

您可以将向量看作是将索引
0,1,2,…,N
映射到值,每个索引一个。抽象地说,这是映射的一个特例,其中键是从0开始的整数。这一概念有助于看到当用作函数时,映射和向量之间在Clojure中的一致性:

(<ILookup-able-collection> <key-for-lookup>)
()

JavaScript做了类似的事情,允许您使用
[]
语法查找数组或对象。

这很有帮助!因此,当我做
(我的vec)
(我的vec 1)
时,它调用
invoke()
,而
IPersistentVector
调用
nth
?在代码中找到了答案:嗯,我想有人对你的陈述“看那个数字”感到困惑,这导致了否决票。。请说明这个数字是一个索引,而不是向量中的一个值:)尽管我怀疑有人刚刚否决了这个问题的所有答案。我投了反对票,因为它没有回答我的实际问题。我的问题不是我为什么会出错。这是关于如何找到调用的函数
invoke()
是我不知道的神奇部分。