Мне нужно создать класс во время выполнения, возможно, не прибегая к eval. Зная, что протокол метаклассом не полностью стандартизован в Common-Lisp, после просмотра через The Common Lisp Object System MetaObject Protocol, я попытался следующий код, чтобы создать класс, экземпляр его, и установить значение слота экземпляра на номер:Как портативно создать класс во время выполнения в Common-Lisp CLOS
(defparameter *my-class*
(make-instance 'standard-class
:name 'my-class
:direct-slots '((:name x :readers (get-x) :writers ((setf get-x))))))
(defparameter *my-instance* (make-instance *my-class*))
(setf (get-x *my-instance*) 42) ;; => 42
к сожалению, этот код работает правильно SBCL, но не на БКК, где создание класса, кажется, работает, но создание экземпляра (make-instance *my-class*)
вызывает следующее сообщение об ошибке:
There is no applicable method for the generic function:
#<STANDARD-GENERIC-FUNCTION INITIALIZE-INSTANCE #x30200002481F>
when called with arguments:
(#<error printing CONS #x302001A9F6A3>
[Condition of type CCL:NO-APPLICABLE-METHOD-EXISTS]
Я пытался смотреть на closer-mop пакет, который должен скрыть различия между различными реализациями мета -объект, но я не смог найти какую-либо функцию или класс, полезные для моей области.
Итак, вопрос заключается в следующем: существует ли способ создания класса и создания экземпляра его во время выполнения, используя непосредственно уровень метакласса CLOS?
С более близкого швабра, вы могли бы попробовать [обеспечить класс] (http://mop.lisp.se/dictionary.html#ensure-class), или [обеспечить класс-с использованием класса] (http://mop.lisp.se/dictionary.html#ensure-class-using-class). – coredump
CCL, похоже, работает, если вы также указываете прямые суперклассы: direct-superclasses (list (find-class 'standard-object)) – jkiiski
Спасибо @jkiiski, проблема в том, что я должен был указать суперкласс. Если вы опубликуете его в качестве ответа, я его приму. – Renzo