以下函数可用于访问符号的属性。
该函数返回 symbol(符号)的属性列表中,名为 property(属性名)的属性对应的值。若不存在该属性,则返回 nil。因此,属性值为 nil 与属性不存在这两种情况无法区分。
属性名 property 会通过 eq 函数与已有的属性名进行比较,因此任意对象都可以作为合法的属性名。
可参见 put 函数的说明以查看示例。
该函数将值 value 存入 symbol(符号)的属性列表中,并关联到属性名 property 之下;若该属性名已存在,则覆盖其原有值。put 函数的返回值为 value。
(put 'fly 'verb 'transitive)
⇒'transitive
(put 'fly 'noun '(a buzzing little bug))
⇒ (a buzzing little bug)
(get 'fly 'verb)
⇒ transitive
(symbol-plist 'fly)
⇒ (verb transitive noun (a buzzing little bug))
该函数返回 symbol(符号)的属性列表。
该函数将 symbol(符号)的属性列表设置为 plist。通常情况下,plist 应当是格式规范的属性列表,但这一要求不会被强制校验。该函数的返回值为 plist。
(setplist 'foo '(a 1 b (2 3) c nil))
⇒ (a 1 b (2 3) c nil)
(symbol-plist 'foo)
⇒ (a 1 b (2 3) c nil)
对于专用符号表(special obarrays)中的符号(并非用于普通用途),以非标准方式使用其属性列表单元是合理的;事实上,*缩写机制(abbrev mechanism) 正是这么做的(see Abbrevs and Abbrev Expansion)。
你可以通过 setplist 和 plist-put 来定义 put,示例如下:
(defun put (symbol prop value)
(setplist symbol
(plist-put (symbol-plist symbol) prop value)))
该函数与 get 完全相同,区别在于:如果 symbol 是某个函数别名,它会去查找实际函数对应符号的属性列表。See 定义函数。
如果可选参数 autoload 为非 nil,且 symbol 是自动加载函数,该函数会尝试自动加载它,因为自动加载可能会设置该符号的 property。如果 autoload 为符号 macro,则仅当 symbol 是自动加载宏时,才尝试自动加载。
该函数将 function 的 property 属性设为 value。function 应当是一个符号。
在设置函数属性时,推荐使用此函数,而非直接调用 put,因为未来它可以支持将旧属性自动映射到新属性。