9.4.1 存取符号属性(DONE)

下面的函数被用来存取符号属性。

Function: get symbol property 该函数返回 symbol 中属性列表中名称为 property 的属性。如果没有这个属性,则会返回 nil。因此,拥有一个值为 nil 的属性 和 没有这个属性是等价的。 参数 property 会与已存在的 property 使用 eq 比较,因此,任何对象都是合理的属性。

请查看 put 的例子。

Function: put symbol property value 这个函数及将 value 放入 符号 symbol 的属性列表中,这个操作会覆盖之前已有的属性值。这个函数会返回 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))

Function: symbol-plist symbol 这个函数返回符号的属性列表。

Function: setplist symbol plist 这个函数将将 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)

在特殊 obarray 中的非常规符号,使用不规范的属性列表有时是很有用的。比如,缩写机制就利用了这个想法。

你可以使用 setplist 和 plist-put 来定义 put 函数。比如:

(defun put (symbol prop value)
  (setplist symbol
            (plist-put (symbol-plist symbol) prop value)))

Function: function-get symbol proerty &optional autoload 这个函数和 get 十分相似,不同的地方在于,若 symbol 是某个函数的别名,它会检索别名指代的真正的符号的属性列表。详情查阅 函数定义 章节。如果可选参数 autoload 是non-nil 值,而 symbol 是 auto-loaded。那这个函数会尝试自动加载,而自动加载可能会导致该符号属性列表的重新设置。如果 autoload 参数是符号macro,那么当且符号是自动加载宏的时候才会尝试自动加载。

Function: function-put function property value 这个函数设置 function 的 property 为 value。参数 function 应该为一个 符号。这个函数倾向于调用 put 函数来为 function 设置属性,这样会很方便我们后续实现从旧属性到新属性的重映射。

最后更新于