如何在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
?