0

新しいクラスを作成するマクロを定義してから、新しく定義されたクラスのインスタンスを作成する定数を定義しました。

(defmacro my-class (name inst)
  `(progn
     (defclass ,name nil nil)
     (defconstant ,inst (make-instance ',name)))))

これはREPLで機能するようです

(my-class x1025 y1025)

しかし、ファイルでコンパイルするとうまくいきません:

There is no class named COMMON-LISP-USER::X1025.
   [Condition of type SIMPLE-ERROR]

Restarts:
  0: [ABORT] Abort compilation.
  1: [*ABORT] Return to SLIME's top level.
  2: [REMOVE-FD-HANDLER] Remove #<SB-IMPL::HANDLER INPUT on descriptor 8: #<CLOSURE (LABELS SWANK-BACKEND::RUN :IN SWANK-BACKEND:ADD-FD-HANDLER) {13228535}>>
  3: [ABORT] Exit debugger, returning to top level.

Backtrace:
  0: (SB-PCL::FIND-CLASS-FROM-CELL X1025 NIL T)
  1: ((:METHOD MAKE-INSTANCE (SYMBOL)) X1025) [fast-method]
  2: (SB-INT:SIMPLE-EVAL-IN-LEXENV (MAKE-INSTANCE (QUOTE X1025)) #<NULL-LEXENV>)
4

1 に答える 1

3

Lisp がインスタンスを作成できるように、コンパイル時にクラスが認識されない場合があります。DEFCLASS標準では、コンパイル中にクラスを認識する必要がありますが、フォームが実際に実行される前にインスタンスを作成することはできません。

DEFCONSTANTMAKE-INSTANCEコンパイル時にフォームを評価することがあります。バックトレースでわかるように、SBCL は実際に を呼び出そうとしますMAKE-INSTANCE

コンパイル時にクラスを完全に使用できるようにする必要があります。EVAL-WHEN前にロードする必要がある別のファイルにクラス宣言を表示または配置します。

于 2014-03-22T21:59:35.357 に答える