(rontolisp) docs
← 特殊形式

defstruct

(defstruct name slot...)

name という名前の構造体型を定義し、名前のシンボルを返します。各 slot はシンボルまたは (slot-name default) で、default はスロットが指定されなかった場合に構築時に評価されます(スコープ内の変数を参照できます)。このフォームは通常の関数を生成します:

  • make-name (&key slot...) — コンストラクタ。スロットはキーワード引数で指定し、未知のキーワードはエラー
  • name-p (object) — 型述語。この構造体のインスタンスに対してのみ t
  • copy-name (object) — 浅いコピーを作るコピー関数
  • name-slot (object) — スロットごとのアクセサ。アクセサは setf 可能な place でもあり、(name-slot obj) への setf/incf/push が使えます

生成される名前は通常の関数なので、第一級の値として使えます(#'point-xmapcarfuncall)。コンパイル経路では defstruct はトップレベルフォームとしてのみサポートされます。インタープリタでは REPL や load 経由でも利用できます。ユーザー定義パッケージの下では、生成される名前はそのパッケージの内部シンボル(geo::make-pt)としてインターンされます。生成される名前を defpackage:export clause に列挙することはサポートされません。

インスタンスはタグ付きリストとして表現されるため、print はその表現を表示します(標準の #S(...) 構文にはならず、読み取りもされません)。インスタンスに対する consp/listpt で、equal はスロット単位で比較します。defstruct のオプション構文((defstruct (name (:conc-name ...) ...) ...))、:include による継承、BOA コンストラクタはサポートされません。また、コンパイル済みプログラムのランタイム evaldefstruct もアクセサの setf place も認識しません(生成された関数を eval から呼び出すことは可能です)。