Многие распространенные реализации Lisp поддерживают CLOS Протокол метаобъектов. Это обеспечивает интроспективные операции для классов, слотов и других метаобъектов.
В LispWorks соответствующие функции доступны непосредственно в пакете CL-USER
.
CL-USER 139 > (defclass shape()
((color :initform :black)
(thickness :initform 1)
(filledp :initform nil)
(window :initform nil)))
#<STANDARD-CLASS SHAPE 40202910E3>
CL-USER 140 > (mapcar #'slot-definition-name
(class-direct-slots (class-of (make-instance 'shape))))
(COLOR THICKNESS FILLEDP WINDOW)
Функция slot-definition-name
и class-direct-slots
определяется протоколом Meta Object для CLOS и поддерживается во многих реализациях Common Lisp - только пакете они находятся, может отличаться. Например, в SBCL их можно найти в пакете SB-MOP
.
Из класса мы можем получить список прямых слотов. Прямые слоты - это слоты, которые непосредственно определены для этого класса и которые не наследуются. Если вы хотите получить список всех слотов, используйте функцию class-slots
.
Slot здесь означает, что мы получаем слот определение объект, который описывает слот. Чтобы получить имя слота, вы должны получить имя из объекта определения слота, используя функцию slot-definition-name
.
Близко связано: http://stackoverflow.com/q/38452350/124319 – coredump
Хорошо, спасибо за ответы. Но у меня другая проблема. Мне нужно знать каждый метод из класса. Даже методы из унаследованного класса. '(defclass point (shape) ((x: initform 0) (y: initform 0))) ' Есть ли способ, как его получить? – Micky
См. Связанный вопрос. – coredump