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

时间:2017-11-04 16:28:07

标签: lisp common-lisp plist

如何从内存中彻底删除属性列表?例:

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

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

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

2 个答案:

答案 0 :(得分:3)

找到它:

(setf (symbol-plist 'book) nil)

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

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