サードパーティのライブラリがファイナライズされたかのようにクラスに作用する必要があるという問題に遭遇しました。少し読んだ後、このメカニズムの背後にある動機を理解しましたが、それがどのように機能するかはよくわかりません.
例:
(make-instance 'expression :op '+ :left 'nan :right 'nan)
(defmethod normalize-expression ((this expression))
(optima:match this
((optima::or (expression :left 'nan) (expression :right 'nan)) 'nan)
((expression :op op :left x :right y) (funcall op x y))))
最初の行を追加しない限り、関数はコンパイルされず、次のエラーが発生します。
; caught ERROR:
; (during macroexpansion of (SB-PCL::%DEFMETHOD-EXPANDER NORMALIZE-EXPRESSION ...))
; SB-MOP:CLASS-SLOTS called on #<STANDARD-CLASS EXPRESSION>, which is not yet finalized.
; See also:
; AMOP, Generic Function SB-MOP:CLASS-SLOTS
optima
はパターン マッチング ライブラリであり、指定されたパターンに対して(expression :op op ...)
クラスのインスタンスをマッチングしますexpression
。詳細はわかりませんが、このクラスに定義されているアクセサを知る必要があるようで、その情報は確定するまで利用できないようです。では、ファイナライズの問題を回避する方法はありますか?
クラスは延長されません (少なくともこのプロジェクトでは延長されず、計画されていません)。ダミーのインスタンスを作成してもそれほど害はありません...それはただの醜い解決策なので、より良い解決策を見つけたいと思っていました。また、おそらく、ファイナライズに関する詳細情報も得られるでしょう。これも良いことです:)