代码之家  ›  专栏  ›  技术社区  ›  Filippo Costa

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

  •  0
  • Filippo Costa  · 技术社区  · 9 年前

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

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

    如何全部删除 'book 的属性而不调用 remprop 三次?

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

    2 回复  |  直到 9 年前
        1
  •  3
  •   Filippo Costa    8 年前

    找到它:

    (setf (symbol-plist 'book) nil)
    

    编辑:经过一些搜索,我得出结论,现代CL代码不使用 get 不再支持 getf .

        2
  •  2
  •   coredump    8 年前

    定义接口

    (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 类,而不仅仅是符号,然后您可以将实现更改为添加,例如以向后兼容的方式处理符号和其他类型的对象的泛型函数。