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

如何在Common Lisp中删除符号的所有属性?,lisp,common-lisp,plist,Lisp,Common Lisp,Plist,如何从内存中完全删除属性列表?例: (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) ni

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

(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
,而支持它。

找到它:

(setf (symbol-plist 'book) nil)
编辑:经过一些搜索,我得出结论,现代CL代码不再使用
get
,而是支持定义接口。

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

(defproperty title)
(defproperty author)
(defproperty publisher)
然后,设置一个标题:

(setf (title :book-identifier) "Title")
访问标题:

(title :book-identifier)
(setf (title :book-identifier) nil)
删除标题:

(title :book-identifier)
(setf (title :book-identifier) nil)
删除所有属性:

(erase-book-properties :book-identifier)
(defparameter *properties* ())
实施 所有属性的列表:

(erase-book-properties :book-identifier)
(defparameter *properties* ())
如所述,仅操作您拥有的属性,不要触摸其他组件可能添加的属性:

(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
类的实例添加标题,而不仅仅是符号,那么您可以将实现更改为添加,例如以向后兼容的方式处理两个符号的通用函数,以及其他类型的对象。

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

(defproperty title)
(defproperty author)
(defproperty publisher)
然后,设置一个标题:

(setf (title :book-identifier) "Title")
访问标题:

(title :book-identifier)
(setf (title :book-identifier) nil)
删除标题:

(title :book-identifier)
(setf (title :book-identifier) nil)
删除所有属性:

(erase-book-properties :book-identifier)
(defparameter *properties* ())
实施 所有属性的列表:

(erase-book-properties :book-identifier)
(defparameter *properties* ())
如所述,仅操作您拥有的属性,不要触摸其他组件可能添加的属性:

(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
类的实例添加标题,而不仅仅是符号,那么您可以将实现更改为添加,例如,以向后兼容的方式处理两个符号的通用函数以及其他类型的对象。

同一图像中的其他对象可能会使用符号属性,所以最好只删除您自己设置的属性。@jkiiski使用
getf
而不是
get
会更好吗?符号属性可能会被同一图像中的其他东西使用,所以最好只删除您自己设置的属性。@jkiiski最好使用
getf
而不是
get