首页 > 解决方案 > Lisp数据结构使用点对中的向量

问题描述

作为对此的迟来的后续行动,有人能告诉我为什么 Emacs ELPA 包archive-contents文件中使用的数据结构是一个名称(符号)和一个包含很多东西的向量的点对吗?

这样做有什么好处?只是随机刺伤似乎太刻意了。这栋楼有什么先例?

(1
 (ace-window .
         [(0 9 0)
          ((avy (0 2 0)))
          "Quickly switch windows." single
          ((:url . "https://github.com/abo-abo/ace-window")
           (:keywords "window" "location"))])

...想象一下(1 ...)有更多的列表成员;例如,可用软件包的 MELPA 列表非常庞大。因此,如果我这样做了,(cdr (assq 'ace-window THELIST))我将获得以 . 开头的虚线对的伴随向量ace-window。几乎看起来该列表是为使用先前的性而设计的。所以是的,为什么他们在这种情况下使用向量?这是一个很好的惯用习惯吗?我听说 Clojure 鼓励更多地使用数组和向量而不是列表。这是否更符合 Clojure 的理念?因此,如果列表更像一个元组,即具有集合、永不改变的成员,是否应该始终使用向量而不是列表?或者这是神秘元组问题的变体?

标签: vectordata-structureselisp

解决方案


因此,如果列表更像一个元组,即具有集合、永不改变的成员,是否应该始终使用向量而不是列表?

这样做有好处1 ,是的。特别是,访问一个元素对于向量来说是 O(1),而对于列表来说是 O(n)。

C-hig (elisp)Sequences Arrays Vectors解释:

“序列”类型是另外两种 Lisp 类型的联合:列表和数组。换句话说,任何列表都是序列,任何数组都是序列。所有序列的共同属性是每个序列都是有序的元素集合。

“数组”是一个固定长度的对象,每个元素都有一个槽。所有元素都可以在恒定时间内访问。数组的四种类型是字符串、向量、字符表和布尔向量。

列表是一系列元素,但它不是单个原始对象;它由 cons 单元格组成,每个元素一个单元格。查找第 N 个元素需要查看 N 个 cons 单元格,因此距离列表开头较远的元素需要更长的时间才能访问。但是可以将元素添加到列表中,或者删除元素。


1根据特定的用例,这些好处在实践中可能是有形的,也可能是无形的。


推荐阅读