Macro DEFTYPE

UP


Macro DEFTYPE

Macro DEFTYPE

構文

deftype name lambda-list [[declaration* | documentation]] form* => name

引数と戻り値

name - シンボル
lambda-list - deftypeラムダリスト
declaration - 宣言式。評価されません。
documentation - 文字列。評価されません。
form - フォーム

定義

deftypenameという名前の派生した型指定子を定義します。 新しい型指定子の意味は、 その型指定子を別の型指定子に展開する関数で与えられ、 展開されたもの自身が別の派生された型指定子の参照を 含んでいればさらに展開されます。

新しく定義された型指定子は、 (name arg1 arg2 ...)というフォームを リストとして受け取り参照します。 引数の数はlambda-listに適合しなければなりません。 もし新しい型指定子が引数を取らないか、 全ての引数がオプションのときは、 その型指定子は原始的な型指定子として使われます (つまり(name)のかわりにnameが使用できます)。

引数の式である、型指定子, arg1, …, argnは評価されません。 かわりにこれらのリテラルオブジェクトは 対応するパラメーターに束縛されたオブジェクトになります。

deftypeフォームのボディ部(ただしlambda-listは除く)は、 暗黙的にnameという名前のblockに囲まれ、 暗黙のprognとして評価され、 新しい型指定子を返却します。

ボディ部のレキシカルな環境は、 deftypeフォームが評価された時点のものであり、 lambda-listの変数によって拡張されます。

型指定子の再帰展開は、 その型指定子についてネストされた展開も含めて、 展開結果を返却して終了しなければなりません。

型指定子を全展開した結果に循環構造が含まれているときは、 それがmembereql型指定子で参照されている オブジェクト内に含まれているのではない場合、結果は未定義です。

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

備考

なし。


TOP, Github