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