Macro DEFTYPE
deftype
name lambda-list [[declaration* |
documentation]] form* => name
name - シンボル
lambda-list - deftype
ラムダリスト
declaration - 宣言式。評価されません。
documentation - 文字列。評価されません。
form - フォーム
deftype
はnameという名前の派生した型指定子を定義します。 新しい型指定子の意味は、 その型指定子を別の型指定子に展開する関数で与えられ、 展開されたもの自身が別の派生された型指定子の参照を 含んでいればさらに展開されます。
新しく定義された型指定子は、 (name arg1 arg2 ...)
というフォームを リストとして受け取り参照します。 引数の数はlambda-listに適合しなければなりません。 もし新しい型指定子が引数を取らないか、 全ての引数がオプションのときは、 その型指定子は原始的な型指定子として使われます (つまり(name)
のかわりにname
が使用できます)。
引数の式である、型指定子, arg1
, …, argn
は評価されません。 かわりにこれらのリテラルオブジェクトは 対応するパラメーターに束縛されたオブジェクトになります。
deftype
フォームのボディ部(ただしlambda-listは除く)は、 暗黙的にnameという名前のblock
に囲まれ、 暗黙のprognとして評価され、 新しい型指定子を返却します。
ボディ部のレキシカルな環境は、 deftype
フォームが評価された時点のものであり、 lambda-listの変数によって拡張されます。
型指定子の再帰展開は、 その型指定子についてネストされた展開も含めて、 展開結果を返却して終了しなければなりません。
型指定子を全展開した結果に循環構造が含まれているときは、 それがmember
かeql
型指定子で参照されている オブジェクト内に含まれているのではない場合、結果は未定義です。
documentationはドキュメント文字の種類type
として nameに割り当てられます。
もしdeftype
フォームがトップレベルフォームとして現れたとき、 コンパイラーは後に続く型宣言でnameという名前が 認識されることを保証しなければなりません。 プログラマーは後に続く型宣言でnameという名前が参照されるとき、 deftype
フォームのボディ部がコンパイル時に 評価されることを保証しなければなりません。 型指定子の展開がコンパイル時に完全に定義できないとき (おそらく知らない型指定子の展開か、 コンパイル時の環境で定義されていない関数を指定した satisfies
のため)、 実装は宣言内のその型の参照を無視するか、 警告を発するか、あるいはその両方かを行うでしょう。
defun equidimensional (a)
(or (< (array-rank a) 2)
(apply #'= (array-dimensions a)))) => EQUIDIMENSIONAL
(deftype square-matrix (&optional type size)
(and (array ,type (,size ,size))
`(satisfies equidimensional))) => SQUARE-MATRIX (
なし。
なし。
なし。
declare
, defmacro
, documentation
, 4.2.3. 型指定子, 3.4.11. ドキュメント文字と宣言の文脈的な作用
なし。