vector - 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 的理念?因此,如果列表更像一个元组,即具有集合、永不改变的成员,是否应该始终使用向量而不是列表?或者这是神秘元组问题的变体?
解决方案
因此,如果列表更像一个元组,即具有集合、永不改变的成员,是否应该始终使用向量而不是列表?
这样做有好处1 ,是的。特别是,访问一个元素对于向量来说是 O(1),而对于列表来说是 O(n)。
C-hig (elisp)Sequences Arrays Vectors
解释:
“序列”类型是另外两种 Lisp 类型的联合:列表和数组。换句话说,任何列表都是序列,任何数组都是序列。所有序列的共同属性是每个序列都是有序的元素集合。
“数组”是一个固定长度的对象,每个元素都有一个槽。所有元素都可以在恒定时间内访问。数组的四种类型是字符串、向量、字符表和布尔向量。
列表是一系列元素,但它不是单个原始对象;它由 cons 单元格组成,每个元素一个单元格。查找第 N 个元素需要查看 N 个 cons 单元格,因此距离列表开头较远的元素需要更长的时间才能访问。但是可以将元素添加到列表中,或者删除元素。
1根据特定的用例,这些好处在实践中可能是有形的,也可能是无形的。
推荐阅读
- javascript - 用 JavaScript 中的 RegExp 在一行中解析电子邮件;使右不区分大小写但保持左
- linux - aarch64 Linux 硬浮点或软浮点
- python - 使用 XArray 数据集重现 Holoviews 示例 box_draw_roi_editor
- java - 是否有任何查询来查找 Firebase 数据库(Android Studio)中同名的孩子的数量总和?
- javascript - 有没有办法在 javascript 的 get 方法中请求多个 url?
- postgresql - 容器是数据库服务器。容器启动后,如何要求它的 Dockerfile 完成构建?
- go - 如何在 Go 中为外部 HTML 模板设置变量?
- c++ - 程序员定义的异常类问题
- kentico - Kentico - 无法以“DD/MM/YYYY”格式保存日期时间
- python - 如何仅从新列表中删除元素