defstruct
(defstruct name slot...)
name という名前の構造体型を定義し、名前のシンボルを返します。各 slot はシンボルまたは (slot-name default) で、default はスロットが指定されなかった場合に構築時に評価されます(スコープ内の変数を参照できます)。このフォームは通常の関数を生成します:
make-name (&key slot...)— コンストラクタ。スロットはキーワード引数で指定し、未知のキーワードはエラーname-p (object)— 型述語。この構造体のインスタンスに対してのみtcopy-name (object)— 浅いコピーを作るコピー関数name-slot (object)— スロットごとのアクセサ。アクセサはsetf可能な place でもあり、(name-slot obj)へのsetf/incf/pushが使えます
生成される名前は通常の関数なので、第一級の値として使えます(#'point-x、mapcar、funcall)。コンパイル経路では defstruct はトップレベルフォームとしてのみサポートされます。インタープリタでは REPL や load 経由でも利用できます。ユーザー定義パッケージの下では、生成される名前はそのパッケージの内部シンボル(geo::make-pt)としてインターンされます。生成される名前を defpackage の :export clause に列挙することはサポートされません。
インスタンスはタグ付きリストとして表現されるため、print はその表現を表示します(標準の #S(...) 構文にはならず、読み取りもされません)。インスタンスに対する consp/listp は t で、equal はスロット単位で比較します。defstruct のオプション構文((defstruct (name (:conc-name ...) ...) ...))、:include による継承、BOA コンストラクタはサポートされません。また、コンパイル済みプログラムのランタイム eval は defstruct もアクセサの setf place も認識しません(生成された関数を eval から呼び出すことは可能です)。