如何在 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.
处理符号的通用函数
如何从内存中完全删除 属性 列表?例如:
(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.