Search code examples
common-lispclosmop

Is there a way to gather slot-definition-readers from all the inheritance tree?


The generic function slot-definition-readers gets an argument that must be a direct-slot-definition. If an object is an instance of a class that inherits from another class how can I get hold of the readers of all the effective-slots of the object? Do I manually have to traverse the tree and call slot-definition-readers on the result of class-direct-slots in each superclass, gathering the results, or is there another way that I am not aware of?


Solution

  • This "community wiki" answer is here to provide an implementation of this feature. What follows uses no destructive operation (NCONC, MAPCAN) since an implementation might return an internal list without copying it. MAPPEND is imported from 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)))