有没有办法从所有继承树中收集槽定义读者?

时间:2016-07-19 07:43:22

标签: common-lisp clos mop

泛型函数slot-definition-readers获取的参数必须是direct-slot-definition。如果一个对象是一个继承自另一个类的类的实例,我怎样才能掌握该对象的所有有效插槽的读者?我是否需要手动遍历树并在每个超类中slot-definition-readers的结果上调用class-direct-slots,收集结果,还是有另一种我不知道的方式?

1 个答案:

答案 0 :(得分:2)

此“社区维基”答案是为了提供此功能的实现。以下内容不使用破坏性操作(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)))