【问题标题】:Is there a way to gather slot-definition-readers from all the inheritance tree?有没有办法从所有继承树中收集槽定义读取器?
【发布时间】:2016-11-21 23:36:33
【问题描述】:

通用函数slot-definition-readers 获取一个必须是direct-slot-definition 的参数。如果一个对象是从另一个类继承的类的实例,我如何才能获得该对象所有有效插槽的读者?我是否必须手动遍历树并在每个超类中对class-direct-slots 的结果调用slot-definition-readers,收集结果,还是有其他我不知道的方法?

【问题讨论】:

  • 我在图书馆没见过这样的东西。它可能存在。但是要知道它看起来你必须像你描述的那样写它。

标签: common-lisp clos mop


【解决方案1】:

此“社区 wiki”答案是为了提供此功能的实现。下面的内容不使用破坏性操作(NCONC、MAPCAN),因为实现可能会返回一个内部列表而不复制它。 MAPPEND从alexandria导入,MOP操作可以从closer-mop导入。

(defun all-direct-slots (class)
  (append (class-direct-slots class)
          (mappend #'all-direct-slots
                   (class-direct-superclasses class))))

(defun all-slot-readers (class)
  (mappend #'slot-definition-readers
           (all-direct-slots class)))

【讨论】:

  • SLOT-DEFINITION-READERS 似乎返回了 SBCL 上的实际阅读器列表(而不是副本),因此将它与 mapcan 一起使用会破坏一些事情(尝试在两个都有阅读器的子类上调用它两次并继承另一个)。您应该使用COPY-LIST 编写它以避免出现问题。
  • @jkiiski 非常感谢
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2010-09-11
  • 2011-02-14
  • 2015-05-01
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多