По метаобъектным системам информацию днём с огнём не сыщешь (что доказывает их нужность :trollface:). Книг тоже меньше, чем три с половиной (или их тоже хрен найдёшь). Да и вообще, складывается такое впечатление, что за пределами Common Lisp к метауровню объектных систем относятся исключительно как «Ух ты, класс класса» — как к забавной, но не глобально продуманной идее. Ими можно пользоваться, чтобы добавить метод-другой, но они не позволяют действительно влиять на объектную систему. Разве что в Руби через призму Гугла и Stack Overflow видится некоторое шевеление на эту тему, но у них там какой-то свой особенный хипстерский мирок, в который я пока не вник.
Так это, я нахожу несколько странным вывод следующей программы:
(defclass extended-class (standard-class)
(additional-slot) )
(defclass extended-object ()
()
(:metaclass extended-class) )
(defun print-metaclass-slot-names (class-name)
(let* ((metaclass (class-of (find-class class-name)))
(metaclass-slots (class-slots metaclass))
(slot-names (mapcar #'slot-definition-name metaclass-slots)) )
(format t "~a: ~a~%" class-name slot-names) ) )
(print-metaclass-slot-names 'standard-class)
(print-metaclass-slot-names 'standard-object)
(print-metaclass-slot-names 'extended-class)
(print-metaclass-slot-names 'extended-object)
Например, я хочу создать иерархию наследования, независимую от существующей. Пусть в ней все классы будут обладать дополнительным слотом abstract, который говорит, применима ли к ним make-instance. То есть я такой создаю свой abstractable-class с этим слотом, его экземпляр называю abstractable-object — это альтернативный корень иерархии наследования, у которого abstract = nil. Но сам метаобъект класса abstractable-class не имеет этого слота, чем нарушает мою хотелку «все классы (новой иерархии) имеют слот abstract».