2

我是 Clojure 的新手,正在尝试学习基础知识。让我感到困惑的一件事是理解数据结构和它们使用的函数之间的相关性。

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

(def my-vec [1 2 3])

然后当我尝试打电话时my-vec

(my-vec)

我得到:

ArityException Wrong number of args (0) passed to: PersistentVector  clojure.lang.AFn.throwArity (AFn.java:437)

我知道我可以传递一个参数,它似乎在调用get,但我怎么知道?argsPersistentVector需要什么,我在哪里可以找到有关它的文档?

我试过:

(doc PersistentVector)

但这又回来了nil

4

4 回答 4

4

可以在 IPersistentVector 下找到文档:http: //clojure.org/data_structures

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

于 2012-08-10T06:29:04.420 回答
1

如果您将一个数字传递给 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)
于 2012-08-10T06:27:39.637 回答
-1

您可以将向量视为将索引映射0, 1, 2, ..., N到值,每个索引都有一个。抽象地说,它是映射的一个特殊情况,其中键是从 0 开始的整数。当用作函数时,该概念有助于查看 Clojure 中映射和向量之间的一致性:

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

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

于 2019-10-28T23:52:21.653 回答
-2

my-vec不是一个函数,所以你应该调用:my-vec 不是(my-vec)

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

链接:第n个

于 2012-08-10T06:17:26.930 回答