有没有办法从所有继承树中收集插槽定义读取器?
Is there a way to gather slot-definition-readers from all the inheritance tree?
通用函数 slot-definition-readers
获取的参数必须是 direct-slot-definition
。如果一个对象是从另一个 class 继承的 class 的实例,我如何才能获得该对象所有有效槽的读者?我是否必须手动遍历树并在每个超级 class 中对 class-direct-slots
的结果调用 slot-definition-readers
,收集结果,还是有其他我不知道的方法?
此 "community wiki" 答案是为了提供此功能的实现。以下内容不使用破坏性操作(NCONC、MAPCAN),因为实现可能 return 一个内部列表而不复制它。 MAPPEND 是从 alexandria, and MOP operations can be imported from 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
获取的参数必须是 direct-slot-definition
。如果一个对象是从另一个 class 继承的 class 的实例,我如何才能获得该对象所有有效槽的读者?我是否必须手动遍历树并在每个超级 class 中对 class-direct-slots
的结果调用 slot-definition-readers
,收集结果,还是有其他我不知道的方法?
此 "community wiki" 答案是为了提供此功能的实现。以下内容不使用破坏性操作(NCONC、MAPCAN),因为实现可能 return 一个内部列表而不复制它。 MAPPEND 是从 alexandria, and MOP operations can be imported from 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)))