:metaclass
defclass 形式で class オプションを使用して、メタクラスを指定できます。
CL-USER> (defclass hierarchical-lock (lock)
((parent :initarg :parent :reader parent))
(:metaclass built-in-class))
#<BUILT-IN-CLASS HIERARCHICAL-LOCK>
ただし、それを実行してクラスを取得することはできますが、それをインスタンス化する方法がわかりません。使用しようとするとmake-instance
失敗します:
CL-USER> (make-instance 'hierarchical-lock)
; There is no applicable method for the generic function:
; #<STANDARD-GENERIC-FUNCTION MAKE-INSTANCE #x30200002676F>
; when called with arguments:
; (#<BUILT-IN-CLASS HIERARCHICAL-LOCK>)
; [Condition of type SIMPLE-ERROR]
make-lock
l0-aprims.lisp で次のように実装されています。
(defun make-lock (&optional name)
"Create and return a lock object, which can be used for synchronization
between threads."
(%make-lock (%make-recursive-lock-ptr) name))
%make-lock
低レベルの実装の詳細に到達するまでの実装を追跡し続けることができますが、典型的な CLOS インスタンスと同じ方法でロックが取得されないことは明らかです。
この回答に対するコメントでの Rainer Joswig の提案に加えて、CCL 開発者に、ロックが CLOS オブジェクトであることに感謝することを知らせるように、いつでもいくつかの集約を使用hierarchical-lock
して、プリミティブ ロック用のスロットと親用のスロットを持つ独自のスロットを定義できます。 . ジェネリック関数の魔法により、ロックを操作するメソッドをジェネリック関数に実装してhierarchical-lock
、組み込みのロックのように動作させることができます。(これは、ロック API が汎用関数に関して定義されていることを前提としています。)