如何在 Common Lisp 中删除符号的所有属性?

How to erase all the properties of a symbol in Common Lisp?

如何从内存中完全删除 属性 列表?例如:

(setf (get 'book 'title) "Gone with the Wind")
(setf (get 'book 'author) "Margaret Micheal")
(setf (get 'book 'publisher) "Warner Books")

如何在不调用 remprop 三次的情况下删除所有 'book 的属性?

我试图查看 HyperSpec,但找不到任何有用的东西。

找到了:

(setf (symbol-plist 'book) nil)

编辑:经过一番搜索,我得出的结论是现代 CL 代码不再使用 get,而是使用 getf

定义接口

您可以定义一个 API 来操作您的数据,而无需将您的代码绑定到特定的实现。用法示例:

(defproperty title)
(defproperty author)
(defproperty publisher)

然后,设置标题:

(setf (title :book-identifier) "Title")

访问标题:

(title :book-identifier)

删除标题:

(setf (title :book-identifier) nil)

擦除所有属性:

(erase-book-properties :book-identifier)

实施

所有属性列表:

(defparameter *properties* ())

jkiiski 所述,仅操作您拥有的属性,不要触及其他组件可能添加的属性:

(defun erase-book-properties (symbol)
  (dolist (property *properties*)
    (remprop symbol property)))

defproperty宏:

(defmacro defproperty (name)
  `(progn
     (defun (setf ,name) (value symbol)
       (prog1 value
         (if value
             (setf (get symbol ',name) value)
             (remprop symbol ',name))))
     (defun ,name (symbol)
       (get symbol ',name))
     (pushnew ',name *properties*)))

重构

如果稍后,您发现您还可以将标题添加到 book 类 的实例,而不仅仅是符号,那么您可以更改实现以添加,例如以 backward-compatible 方式和其他类型的 objects.

处理符号的通用函数