(rontolisp) docs
← 特殊形式

defclass

(defclass name (superclass?) ((slot slot-option...) ...) class-option...)

クラスを定義し、名前シンボルを返します。これは 静的な CLOS サブセットです。スーパークラスは最大 1 つ(単一継承)で、インスタンスは make-instance で生成されるタグ付きリストとして表現されます(defstruct のインスタンスと同様に consp を満たし、print はそのリスト表現を表示します)。スロットオプション:

  • :initarg keyword — コンストラクタで使うキーワード(省略時はスロット名のキーワード)
  • :initform expr — スロットが与えられなかったときに生成時に評価されるデフォルト値(省略時は nil。unbound 状態はありません)
  • :reader fnfn を読み取り関数として定義
  • :accessor fn:reader と同様で、さらに setf 可能な place になります

サブクラスはスーパークラスの全スロットを継承し(継承したスロットの再定義はエラー)、そのインスタンスはスーパークラスに対する defmethod のクラス specializer にマッチします。reader/accessor は通常の defun なので第一級関数です。クラスオプション (:documentation "...") は受理して無視されます。その他のクラスオプション、その他のスロットオプション(:allocation:writer:type など)、多重継承はエラーです。コンパイルパスでは defclass はトップレベルフォームとしてのみサポートされ、実行時のクラス操作(find-classchange-class、クラス再定義)はありません。