字符表与向量非常相似,区别在于它的索引是字符编码。任何不带修饰符的合法字符编码,都可以作为字符表的索引。你可以像操作普通数组一样,使用 aref 和 aset 访问字符表的元素。
此外,字符表还可以拥有 额外槽位(extra slot),用于存储与特定字符编码无关的附加数据。和向量一样,字符表在求值时是常量,并且可以存放任意类型的元素。
每个字符表都有一个 子类型(subtype),它是一个符号,主要有两个作用:
display-table 的字符表,语法表(syntax table)则是子类型为 syntax-table 的字符表。可以使用下文描述的 char-table-subtype 函数查询子类型。
char-table-extra-slots 符号属性指定(see 符号属性),其值应为 0 到 10 之间的整数。如果子类型没有该符号属性,则字符表不包含额外槽位。
字符表可以拥有一个 父表(parent),即另一个字符表。如果存在父表,那么当该字符表对某个特定字符 c 的取值为 nil 时,就会继承父表中对应字符的值。换句话说,当 char-table 自身对 c 的取值为 nil 时,(aref char-table c) 会返回其父表中的值。
字符表还可以拥有一个 默认值(default value)。如果设置了默认值,那么当字符表未为某字符指定任何非 nil 值时,(aref char-table c) 就会返回该默认值。
创建并返回一个新的字符表(char-table),其子类型为 subtype(一个符号)。表中每个元素都会初始化为 init,该参数默认值为 nil。字符表创建完成后,你无法修改其子类型。
该函数没有用于指定字符表长度的参数,因为所有字符表都预留了空间,可将任意有效的字符编码作为索引使用。
如果 subtype 拥有 char-table-extra-slots 符号属性,该属性的值会指定字符表中额外槽位(extra slots)的数量。该值必须是 0 到 10 之间的整数;否则 make-char-table 会抛出错误。若 subtype 没有 char-table-extra-slots 符号属性(see 属性列表),则该字符表不包含任何额外槽位。
如果 object 是字符表,该函数返回 t,否则返回 nil。
该函数返回 char-table 的子类型符号。
没有专门用于访问字符表中默认值的函数。要获取默认值,请使用 char-table-range(见下文)。
该函数返回 char-table 的父表。父表只能是 nil 或者另一个字符表。
该函数将 char-table 的父表设置为 new-parent。
该函数返回 char-table 的第 n 个额外槽位的内容(从 0 开始编号)。字符表的额外槽位数量由其子类型决定。
该函数将 value 存入 char-table 的第 n 个额外槽位(从 0 开始编号)。
字符表既可以为单个字符编码指定元素值,也可以为整个字符集指定一个值。
该函数返回 char-table 中为字符范围 range 指定的值。range 的取值有以下几种情况:
nil指代默认值。
指代字符 char 对应的元素(前提是 char 为有效的字符编码)。
(from . to)一个点对(cons cell)指代闭区间 ‘[from..to]’ 内的所有字符。此种情况下,函数会返回 from 所指定字符对应的值。
该函数用于在 char-table 中为字符范围 range 设置值。range 可以取以下几种值:
nil表示默认值。
t表示全部字符编码范围。
表示字符 char 对应的元素(前提是 char 为有效的字符编码)。
(from . to)一个点对单元,表示闭区间 ‘[from..to]’ 内的所有字符。
该函数会为 char-table 中每个值为非 nil 的元素调用参数 function。调用 function 时会传入两个参数:一个键(key)和一个值(value)。其中,键是可传给 char-table-range 的合法 range 参数 — 既可以是一个有效的字符,也可以是一个点对 (from . to)(用于指定一组共享同一值的字符范围);而值则是 (char-table-range char-table key) 函数的返回结果。
总体而言,传给 function 的键值对完整描述了 char-table 中存储的所有值。
该函数的返回值始终为 nil;若要让 map-char-table 的调用产生实际作用,function 需包含副作用逻辑。例如,以下是检查语法表元素的方法:
(let (accumulator)
(map-char-table
(lambda (key value)
(setq accumulator
(cons (list
(if (consp key)
(list (car key) (cdr key))
key)
value)
accumulator)))
(syntax-table))
accumulator)
⇒
(((2597602 4194303) (2)) ((2597523 2597601) (3))
... (65379 (5 . 65378)) (65378 (4 . 65379)) (65377 (1))
... (12 (0)) (11 (3)) (10 (12)) (9 (0)) ((0 8) (3)))