次: , 前: Simple Types, 上: Customization Types


13.4.2 複合型

単純型が適切でない場合には、 他の型から新たな型を作り上げる複合型を使えます。 これには、いくつかの方法があります。

(restricted-sexp :match-alternatives criteria)
値は、criteriaの1つを満たす任意のLispオブジェクトでよい。 criteriaはリストであり、その各要素は以下の1つであること。

たとえば、

          (restricted-sexp :match-alternatives
                           (integerp 't 'nil))
     

は、整数、tnilが正しい値である。

カスタマイズバッファでは、すべての正しい値はその入力構文で表示し、 ユーザーはそれらをテキストとして編集する。

(cons car-type cdr-type)
値はコンスセルである必要があり、 そのcarcar-typeに合い、かつ、 そのcdrcdr-typeに合う必要がある。 たとえば、(cons string symbol)は、 ("foo" . foo)などの値に一致するカスタマイズ型である。

カスタマイズバッファでは、 carcdrは、 それらに指定した型に応じて別々に表示され、個別に編集できる。

(list element-types...)
値はelement-typesに指定したとおりの個数のリストである必要があり、 各要素はelement-typeに合うこと。

たとえば、(list integer string function)は、 3要素のリストを意味し、 第1要素は整数、第2要素は文字列、第3要素は関数であることを指定する。

カスタマイズバッファでは、 各要素は、それらに指定した型に応じて別々に表示され、個別に編集できる。

(vector element-types...)
listと同様だが、値はリストではなくベクトルである必要がある。 その要素はlistの場合と同じ。
(choice alternative-types...)
値は、alternative-typesの少なくとも1つに合う必要がある。 たとえば、(choice integer string)は、整数か文字列を許す。

カスタマイズバッファでは、ユーザーはメニューを使って選択肢を選び、 その選択肢において普通の方法で値を編集する。

通常、このメニューの選択肢名は、選択肢から自動的に決定されるが、 選択肢に:tagキーワードを含めることで、 メニューに異なる名前を指定できる。 たとえば、整数が空白の個数を表し、文字列がそのまま使うテキストを表す場合には、 つぎのようにカスタマイズ型を書く。

          (choice (integer :tag "Number of spaces")
                  (string :tag "Literal text"))
     

そうすると、メニューには、 `Number of spaces'と`Literal Text'が表示される。

const以外のnilが正当な値ではない選択肢では、 そのような選択肢には:valueキーワードを使って 正当なデフォルト値を指定すること。 See Type Keywords

(const value)
値はvalueであること。 それ以外は許さない。

constの主な用途はchoiceの内側である。 たとえば、(choice integer (const nil))は、整数かnilを許す。

choiceの内側では、constにしばしば:tagを使う。 たとえば、

          (choice (const :tag "Yes" t)
                  (const :tag "No" nil)
                  (const :tag "Ask" foo))
     

は、tは『yes』(はい)、nilは『no』(いいえ)、 fooは『ask』(問い合わせる)を意味する変数を記述する。

(other value)
この選択肢は任意のLisp値に一致するが、 ユーザーがこの選択肢を選ぶと、値valueを選ぶことになる。

otherは、主に、choiceの最後の要素として使うことである。 たとえば、

          (choice (const :tag "Yes" t)
                  (const :tag "No" nil)
                  (other :tag "Ask" foo))
     

は、tは『yes』(はい)、nilは『no』(いいえ)、 それ以外は『ask』(問い合わせる)を意味することを示す。 ユーザーが選択肢のメニューから`Ask'を選ぶと、値fooを指定する。 しかし、(tでもnilでもfooでもない)それ以外の値は、 fooと同様に`Ask'と表示される。

(function-item function)
constと同様だが、関数であるような値に使う。 これは、関数名に加えて説明文字列を表示する。 説明文字列は、:docに指定したものか、 functionそのものの説明文字列である。
(variable-item variable)
constと同様だが、変数名であるような値に使う。 これは、変数名に加えて説明文字列を表示する。 説明文字列は、:docに指定したものか、 variableそのものの説明文字列である。
(set elements...)
値はリストである必要があり、 その各要素はelementsに指定したものの1つである必要がある。 これは、カスタマイズバッファにはチェックリストとして表示される。
(repeat element-type)
値はリストである必要があり、 その各要素はelement-typeに指定した型に合う必要がある。 これは、カスタマイズバッファには、 要素を追加したり削除したりする`[INS]'や`[DEL]'ボタンを伴って、 要素のリストとして表示される。