次: , 前: Vector Functions, 上: Sequences Arrays Vectors


6.6 文字テーブル

文字テーブルはベクトルによく似ていますが、 文字コードで添字付けする点が異なります。 修飾子を伴わない任意の正当な文字コードは、文字テーブルの添字に使えます。 文字テーブルの要素は、任意の配列のように、arefasetで 参照できます。 さらに、文字テーブルでは、 特定の文字コードには対応しない追加データを保持するための追加スロットを 保持できます。 評価時には、文字テーブルは定数です。

各文字テーブルには、シンボルであるサブタイプ(subtype)があります。 サブタイプには2つの目的があります。 異なる使い方をする文字テーブルを区別するためと、 追加スロットの個数を制御するためです。 たとえば、表示テーブルはサブタイプがdisplay-tableである 文字テーブルであり、 構文テーブルはサブタイプがsyntax-tableである文字テーブルです。 正当なサブタイプには、char-table-extra-slots属性があるはずで、 その値は0から10までの整数です。 この整数が文字テーブルの追加スロットの個数を指定します。

文字テーブルは、別の文字テーブルであるを持てます。 その場合、特定の文字cに対する文字テーブルの指定がnilのときには、 親において指定された値を継承します。 いいかえれば、char-table自体にnilを指定してあると、 (aref char-table c)は、 char-tableの親の値を返します。

文字テーブルは、デフォルト値も持てます。 その場合、文字テーブルが指定する値がnilであると、 (aref char-table c)はデフォルト値を返します。

— 機能: make-char-table subtype &optional init

サブタイプがsubtypeである新たに作成した文字テーブルを返す。 各要素をinitで初期化する。 なお、initのデフォルトはnilである。 文字テーブル作成後には、文字テーブルのサブタイプは変更できない。

文字テーブルの長さを指定する引数はない。 なぜなら、すべての文字テーブルでは、 任意の正当な文字コードを添字として使えるからである。

— 機能: char-table-p object

この関数は、objectが文字テーブルならばtを返し、 さもなければnilを返す。

— 機能: char-table-subtype char-table

この関数はchar-tableのサブタイプを表すシンボルを返す。

— 機能: set-char-table-default char-table new-default

この関数はchar-tableのデフォルト値をnew-defaultにする。

文字テーブルのデフォルト値を参照するための特別な関数はない。 それには(char-table-range char-table nil)を使う。

— 機能: char-table-parent char-table

この関数はchar-tableの親を返す。 親は、nilであるか他の文字テーブルである。

— 機能: set-char-table-parent char-table new-parent

この関数はchar-tableの親をnew-parentにする。

— 機能: char-table-extra-slot char-table n

この関数はchar-tableの追加スロットnの内容を返す。 文字テーブル内の追加スロットの個数はそのサブタイプで決まる。

— 機能: set-char-table-extra-slot char-table n value

この関数はchar-tableの追加スロットnvalueを格納する。

文字テーブルでは、1つの文字コードに対して1つの要素値を指定できます。 また、文字集合全体に対して1つの値を指定することもできます。

— 機能: char-table-range char-table range

これは、char-tableにおいて文字範囲rangeに指定されている値を返す。 rangeとして可能なものは以下のとおり。

nil
デフォルト値を指す。
char
charが正当な文字コードであると仮定して) 文字charに対する要素を指す。
charset
文字集合charset全体に対して指定してある値を指す (see Character Sets)。
generic-char
文字集合に対する汎用文字を表す。 引数として汎用文字を指定することは、文字集合名を指定することと同値。 汎用文字の説明は、see Splitting Characters

— 機能: set-char-table-range char-table range value

この関数は文字範囲rangeに対するchar-tableの値を設定する。 rangeとして可能なものは以下のとおり。

nil
デフォルト値を指す。
t
文字コードの範囲全体を指す。
char
charが正当な文字コードであると仮定して) 文字charに対する要素を指す。
charset
文字集合charset全体に対して指定してある値を指す (see Character Sets)。
generic-char
文字集合に対する汎用文字を表す。 引数として汎用文字を指定することは、文字集合名を指定することと同値。 汎用文字の説明は、see Splitting Characters

— 機能: map-char-table function char-table

この関数は、char-tableの各要素についてfunctionを呼び出す。 functionをキーと値の2つの引数で呼び出す。 キーはchar-table-rangeに対する可能なrange引数であり、 正当な文字か汎用文字である。 値は(char-table-range char-table key)である。

全体として、functionに渡すキー・値の対は、 char-tableに格納されたすべての値を表す。

戻り値はつねにnilである。 この関数が有用であるようにするには、 functionには副作用があるべきである。 たとえば、つぎは構文テーブルの各要素の調べ方である。

          (let (accumulator)
            (map-char-table
             #'(lambda (key value)
                 (setq accumulator
                       (cons (list key value) accumulator)))
             (syntax-table))
            accumulator)
          =>
          ((475008 nil) (474880 nil) (474752 nil) (474624 nil)
           ... (5 (3)) (4 (3)) (3 (3)) (2 (3)) (1 (3)) (0 (3)))