% Macro DEFTYPE
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. ドキュメント文字と宣言の文脈的な作用
なし。