Next: Splicing into Lists, Previous: Simple Types, Up: Customization Types [Contents][Index]
適切なシンプル型がないときは、複合型(composite types)を使うことができます。複合型は特定のデータによる他の型から、新しい型を構築します。指定された型またはデータは、その複合型の引数(argument)と呼ばれます。複合型は通常、以下のようなものです:
(constructor arguments…)
しかし、以下のように引数の前にkeyword-valueペアーを追加することもできます。
(constructor {keyword value}… arguments…)
以下のテーブルに、はコンストラクター(constructor)と、複合型を記述するためにそれらを使用する方法を示します:
(cons car-type cdr-type)
値はコンスセルでなければならず、CARはcar-type、CDRはcdr-typeに適合していなければなりません。たとえば、(cons
string symbol)
は、("foo" . foo)
のような値にマッチするデータ型です。
カスタマイズバッファーでは、CARとCDRは、それぞれ特定のデータ型に応じて、別々に表示・編集されます。
(list element-types…)
値は、element-typesで与えられる要素と数が正確に一致するリストでなければならず、リストの各要素はそれぞれ対応するelement-typeに適合しなければなりません。
たとえば、(list integer string
function)
は、3つの要素のリストを示し、1つ目の要素は整数、2つ目の要素は文字列、3つ目の要素は関数です。
カスタマイズバッファーでは、各要素は、それぞれ特定のデータ型に応じて、別々に表示・編集されます。
(group element-types…)
これはlist
と似ていますが、Customバッファー内でのテキストのフォーマットが異なります。list
は各要素の値を、そのタグでラベルづけしますが、group
はそれを行いません。
(vector element-types…)
これはlist
と似ていますが、リストではなくベクターでなければなりません。各要素はlist
の場合と同様に機能します。
(alist :key-type key-type :value-type value-type)
値はコンスセルのリストでなければならず、各セルのCARはカスタマイズ型key-typeのキーを表し、同じセルのCDRはカスタマイズ型value-typeの値を表します。ユーザーはkey/valueペアーの追加や削除ができ、各ペアのキーと値の両方を編集することができます。
省略された場合、key-typeとvalue-typeのデフォルトは、sexp
です。
ユーザーは指定されたkey-typeにマッチする任意のキーを追加できますが、:options
(Variable Definitionsを参照してください)で指定することにより、あるキーを優先的に扱うことができます。指定されたキーは、(適切な値とともに)常にカスタマイズバッファーに表示されます。また、alistにkey/valueを含める、除外する、または無効にするかを指定するチェックボックスも一緒に表示されます。ユーザーは:options
キーワード引数により指定された値は、変更できません。
:options
キーワードにたいする引数は、alist内の適切なキーにたいする仕様のリストであるべきです。これらは通常、単純なアトムであり、それらは自身をを意味します。たとえば:
:options '("foo" "bar" "baz")
これは、名前が"foo"
、"bar"
、"baz"
の、3つの“既知”のキーがあることを指定し、それらは常に最初に表示されます。
たとえば"bar"
キーに対応する値を整数だけにするというように、特定のキーに対して値の型を制限したいときがあるかもしれません。これはリスト内でアトムのかわりにリストを使用することにより、指定することができます。前述のように、1つ目の要素はそのキーを指定し、2つ目の要素は値の型を指定します。たとえば:
:options '("foo" ("bar" integer) "baz")
最後に、キーが表示される方法を変更したいときもあるかもしれません。デフォルトでは、:options
キーワードで指定された特別なキーはユーザーが変更できないので、キーは単にconst
として表示されます。しかし、たとえばそれが関数バインディングをもつシンボルだと知っている場合はfunction-item
といったように、あるキーの表示のために、より特化した型を使用したいと思うかもしれません。これは、キーに対してシンボルを使うかわりに、カスタマイズ型指定を使用することにより、行うことができます。
:options '("foo" ((function-item some-function) integer) "baz")
多くのalistは、コンスセルのかわりに2要素のリストを使用します。たとえば、
(defcustom cons-alist '(("foo" . 1) ("bar" . 2) ("baz" . 3)) "Each element is a cons-cell (KEY . VALUE).")
のかわりに以下を使用します
(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3)) "Each element is a list of the form (KEY VALUE).")
リストはコンスセルの最上位に実装されているため、上記のlist-alist
を、コンスセルのalist(value-typeが実際の値を含む1要素のリストであるような)として扱うことができます。
(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3)) "Each element is a list of the form (KEY VALUE)." :type '(alist :value-type (group integer)))
list
のかわりにgroup
を使用するのは、その目的に適したフォーマットのためだけです。
同様に、以下のようなトリックの類を用いることにより、より多くの値が各キー連づけられたalistを得ることができます:
(defcustom person-data '(("brian" 50 t) ("dorith" 55 nil) ("ken" 52 t)) "Alist of basic info about people. Each element has the form (NAME AGE MALE-FLAG)." :type '(alist :value-type (group integer boolean)))
(plist :key-type key-type :value-type value-type)
このカスタマイズ型はalist
(上位参照)と似ていますが、(1)情報がプロパティーリスト(Property Listsを参照してください)に格納され、(2)key-typeが省略された場合、デフォルトはsexp
ではなく、symbol
になります。
(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
キーワードを使用して、有効なデフォルト値を指定するべきです。Type Keywordsを参照してください。
複数の候補によりいくつかの値が提供される場合、カスタマイズは適合する値をもつ最初の候補を選択します。これは常に、もっとも特有な型を最初に、もっとも一般的な型を最後にリストすべきことを意味します。以下は適切な使い方の例です:
(choice (const :tag "Off" nil) symbol (sexp :tag "Other"))
この使い方では、特別な値nil
はその他のシンボルとは別に扱われ、シンボルは他のLisp式とは別に扱われます。
(radio element-types…)
これはchoice
と似ていますが、選択はメニューではなく、‘ラジオボタン’で表示されます。これは該当する選択にたいしてドキュメントが表示できる利点があるので、関数定数(function-item
カスタマイズ型)の選択に適す場合があります。
(const value)
値はvalueでなければならず、他は許されません。
const
は主にchoice
の中で使用されます。たとえば、(choice integer (const
nil))
では、整数かnil
が選択できます。
choice
の中では、:tag
とともにconst
が使用される場合があります。たとえば、
(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 types…)
値はリストでなければならず、指定されたtypesの1つにマッチしなければなりません。
これはカスタマイズバッファーではチェックリストとして表示されるので、typesはそれぞれ対応する要素を1つ、あるいは要素をもちません。同じ1つのtypesにマッチするような、異なる2つの要素を指定することはできません。たとえば、(set
integer
symbol)
は、リスト内で1つの整数、および/または1つのシンボルが許され、複数の整数や複数のシンボルは許されません。結果として、set
内でinteger
のような特定的ではない型を使用するのは稀です。
以下のように、const
型はset
内のtypesでよく使用されます:
(set (const :bold) (const :italic))
alist内で利用できる要素を示すために使用されることもあります:
(set (cons :tag "Height" (const height) integer) (cons :tag "Width" (const width) integer))
これによりユーザーにオプションでheightとwidthの値を指定させることができます。
(repeat element-type)
値はリストでなければならず、リストの各要素は型element-typeに適合しなければなりません。カスタマイズバッファーでは要素のリストとして表示され、‘[INS]’および‘[DEL]’ボタンにより、要素の追加や削除が行われます。
(restricted-sexp :match-alternatives criteria)
これはもっとも汎用的な複合型の構築方法です。値はcriteriaを満足する任意のLispオブジェクトです。criteriaはリストで、リストの各要素は以下のうちの1つを満たす必要があります:
nil
か非nil
のどちらかをリターンする関数。リスト内での述語の使用により、その述語が非nil
をリターンするようなオブジェクトが許されることを意味する。
'object
。リスト内でこの要素は、object自身が容認される値であることを示す。
たとえば、
(restricted-sexp :match-alternatives (integerp 't 'nil))
これは整数、t
、nil
を正当な値として受け入れます。
カスタマイズバッファーは適切な値をそれらの入力構文ですべて表示し、ユーザーはこれらをテキストとして編集できます。
以下は複合型でキーワード/値ペアーとして使用できるキーワードのテーブルです:
:tag tag
tagは、ユーザーとのコミュニケーションのために、その候補の名前として使用される。choice
内に出現する型にたいして有用。
:match-alternatives criteria
criteriaは可能な値とのマッチに使用されます。restricted-sexp
内でのみ有用です。
:args argument-list
型構築の引数としてargument-listの要素を使用します。たとえば、(const :args
(foo))
は(const
foo)
と等価です。明示的に:args
とく記述する必要があるのは稀です。なぜなら、最後のキーワード/値ペアーの後に続くものは何であれ、引数として認識されるからです。
Next: Splicing into Lists, Previous: Simple Types, Up: Customization Types [Contents][Index]