実行時にクラスを作成する必要があります。メタクラスプロトコルが完全に共通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ではなく、クラスの作成が動作しているようですCCL、上で正常に動作しますが、次のエラーが発生し(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