我有一个关于Elisp矢量的问题.整数和字符是否实际存储(有效)在向量内或通过引用(指针)?向量可以包含任意对象,例如:
(setq v (make-vector 10 nil))
(aset v 0 "Hello World")
Run Code Online (Sandbox Code Playgroud)
在这种情况下,很明显,向量单元0保持对字符串"Hello World"的引用(指针).但整数/字符怎么样?
(aset v 1 ?X)
Run Code Online (Sandbox Code Playgroud)
字符X是否实际存储在向量的单元格1中?
在C级别,emacs lisp对象是一个包含标记位和值位的字大小的对象.标记位确定如何解释值位:作为指针(和什么),或作为直接常量,如整数或字符.这是一种用于高级语言的相当常见的实现技术.
(普通)向量是这样的对象的数组,因此在整数或字符的向量中没有间接.字符串和位向量提供更紧凑的表示,代价是分别只能存储字符或布尔值.
表示的详细信息(例如有多少标记位,有多大整数等等)取决于Emacs的版本和编译时设置.魔术发生的源文件是src/lisp.h.