如何从内存中彻底删除属性列表?例:
(setf (get 'book 'title) "Gone with the Wind")
(setf (get 'book 'author) "Margaret Micheal")
(setf (get 'book 'publisher) "Warner Books")
如何在不调用'book
三次的情况下删除所有remprop
的属性?
我试图查看HyperSpec,但我找不到任何有用的东西。
答案 0 :(得分:3)
答案 1 :(得分:2)
您可以定义一个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
类的实例,而不仅仅是符号,那么您可以更改要添加的实现,例如通用函数以向后兼容的方式处理两个符号,以及其他类型的对象。