[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4. 文字列と文字

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Strings%20and%20Characters"
"elisp/文字列と文字"へのコメント(無し)

Emacs Lispの文字列は文字の順序列を保持している配列です。 文字列は、シンボル、バッファ、ファイルのそれぞれの名前として、 ユーザーへメッセージを送るため、 バッファ間でコピーするテキストを保持するため、 その他さまざまな目的に使われます。 文字列はとても重要なので、 Emacs Lispには文字列を操作する関数が数多くあります。 Emacs Lispのプログラムでは、個々の文字よりも文字列を多用します。

キーボード文字イベントを表す文字列に関する特別な配慮については、 See 節 20.5.14 キーボードイベントを文字列で保持する



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.1 文字列と文字の基本

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=String%20Basics"
"elisp/文字列と文字の基本"へのコメント(無し)

Emacs Lispの文字列は文字の順序列を保持している配列です。 Emacs Lispでは文字を整数で表現します。 整数が文字であるかどうかは、その使われ方からしか判断できません。 したがって、文字列は、実際には、整数群を保持しているのです。

(任意の配列と同様に)文字列の長さは固定されていて、 文字列をいったん作成すると変更できません。 Lispの文字列は特別な文字コードで終端されるのではありません。 (対照的に、C言語の文字列はASCIIコード0で終端される。)

文字列は配列ですからシーケンスでもあり、 一般の配列関数やシーケンス関数で文字列を操作できます。 (see 節 6. シーケンス、配列、ベクトル。) たとえば、関数arefaset(see 節 6.3 配列操作関数)を 用いて、文字列内の個々の文字を参照したり変更できます。

Emacs文字列(およびバッファ)内の非ASCII文字のテキスト表現は 2種類あります。 ユニバイトとマルチバイトです(see 節 32.1 テキスト表現)。 ASCII文字は、文字列内ではつねに1バイトを占めます。 実際、すべてがASCII文字である文字列では、2つの表現に違いはありません。 ほとんどのLispプログラムでは、 読者はこれらの2つの表現を考慮する必要はないでしょう。

キー列を文字列として表現することがあります。 文字列がキー列を表す場合、128から255の範囲にある文字列の要素は、 その範囲の文字コードとしてではなく、 (非常に大きな整数になる)メタ文字を表現します。

文字列は、ハイパー、スーパー、アルトの修飾子を持つ文字を保持できません。 文字列はASCIIコントロール文字を保持できますが、 それ以外のコントロール文字を保持できません。 文字列では、ASCIIコントロール文字の大文字小文字を区別できません。 キー列などのそのような文字をシーケンスに収めるには、 文字列のかわりにベクトルを使う必要があります。 キーボード入力文字に対するメタなどの修飾子の表現については、 See 節 2.3.3 文字型

文字列は正規表現を保持するのにも便利です。 文字列に対して正規表現の一致を取ることもできます(see 節 33.3 正規表現の探索)。 関数match-string(see 節 33.6.2 マッチデータの簡単な参照)と replace-match(see 節 33.6.1 一致したテキストの置換)は、 正規表現の一致に基づいて文字列を分解したり変更するのに便利です。

バッファと同様に、文字列は、 文字そのものに加えて文字列内の文字に対するテキスト属性を保持できます。 See 節 31.19 テキスト属性。 文字列からバッファや他の文字列へテキストをコピーするすべてのLisp基本関数は、 コピーする文字の属性もコピーします。

文字列を表示したりバッファへコピーする関数については、See 節 31. テキスト。 文字と文字列の構文については、2.3.3 文字型とSee 節 2.3.8 文字列型。 テキスト表現を変換したり、文字コードを符号化/復号化する関数については、 See 節 32. 非ASCII文字



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.2 文字列向けの述語

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Predicates%20for%20Strings"
"elisp/文字列向けの述語"へのコメント(無し)

一般のシーケンスや配列に対する述語について詳しくは、 6. シーケンス、配列、ベクトルとSee 節 6.2 配列

Function: stringp object
この関数は、objectが文字列ならばtを返し、 さもなければnilを返す。

Function: char-or-string-p object
この関数は、objectが文字列か文字(つまり、整数)ならば tを返し、さもなければnilを返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.3 文字列の作成

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Creating%20Strings"
"elisp/文字列の作成"へのコメント(無し)

以下の関数は、新たに文字列を作成したり、 文字列を連結したり分解して文字列を作成します。

Function: make-string count character
この関数は、文字charactercount回繰り返して作成した文字列を返す。 countが負であるとエラーを通知する。

 
(make-string 5 ?x)
     => "xxxxx"
(make-string 0 ?x)
     => ""

この関数に対比するものに、 char-to-string(see 節 4.6 文字と文字列の変換)、 make-vector(see 節 6.4 ベクトル)、 make-list(see 節 5.5 コンスセルとリストの構築)などがある。

Function: string &rest characters
これは、複数個の文字群charactersが入った文字列を返す。

 
(string ?a ?b ?c)
     => "abc"

Function: substring string start &optional end
この関数は、stringstartから end(の直前)までの範囲にある文字から成る新たな文字列を返す。 先頭の文字を0で添字付けする。

 
(substring "abcdefg" 0 3)
     => "abc"

ここで、`a'の添字は0、`b'の添字は1、`c'の添字は2である。 したがって、文字列"abcdefg"から3文字`abc'をコピーする。 添字3はコピーする部分文字列の境界の文字位置を表す。 添字が3である文字は、実際には文字列内の4番目の文字である。

負の数は文字列の末尾から数える。 したがって、-1は文字列の最後の文字の添字である。 たとえば、

 
(substring "abcdefg" -3 -1)
     => "ef"

この例では、`e'の添字は-3、`f'の添字は-2、 `g'の添字は-1である。 したがって、`e'と`f'を含むが`g'は含まない。

添字にnilを使うと、文字列の長さを意味する。 したがって、つぎのようになる。

 
(substring "abcdefg" -3 nil)
     => "efg"

引数endを省略することは、nilを指定することと等価である。 そのため、(substring string 0)は、 string全体をコピーしたものを返す。

 
(substring "abcdefg" 0)
     => "abcdefg"

しかし、このような目的にはcopy-sequenceを勧める (see 節 6.1 シーケンス)。

stringからコピーした文字にテキスト属性があれば、 新たな文字列にもそのテキスト属性をコピーする。 see 節 31.19 テキスト属性

substringは第1引数としてベクトルも受け付ける。 たとえば、つぎのとおり。

 
(substring [a b (c) "d"] 1 3)
     => [b (c)]

startendが整数でもnilでもないと、 エラーwrong-type-argumentを通知する。 startendよりうしろの文字を指していたり、 いずれかの整数がstringの範囲外であると エラーargs-out-of-rangeを通知する。

この関数と対照的なのがbuffer-substring (see 節 31.2 バッファの内容を調べる)であり、 カレントバッファ内のテキストの一部を収めた文字列を返す。 文字列の先頭は0で添字付けするが、バッファの先頭は1で添字付けする。

Function: concat &rest sequences
この関数は、渡した引数の文字から成る (テキスト属性があればそれも含めて)新たな文字列を返す。 引数は、文字列、数のリスト、数のベクトルである。 引数自身は変更しない。 concatに引数を指定しないと空文字列を返す。

 
(concat "abc" "-def")
     => "abc-def"
(concat "abc" (list 120 121) [122])
     => "abcxyz"
;; nilは空シーケンス
(concat "abc" nil "-def")
     => "abc-def"
(concat "The " "quick brown " "fox.")
     => "The quick brown fox."
(concat)
     => ""

関数concatは、 既存の文字列とeqではない新たな文字列をつねに作り出す。

引数が(整数のシーケンスではなく)整数であると、 その整数の表示表現を構成する文字列に変換する。 この機能を使わないでほしい。 削除する予定である。 読者がこの機能を使っていたら、今すぐプログラムを直すこと! 整数をこのような10進数に変換する正しい方法は、 format(see 節 4.7 文字列の書式付け)や number-to-string(see 節 4.6 文字と文字列の変換)を使うことである。

 
(concat 137)
     => "137"
(concat 54 321)
     => "54321"

他の連結関数については、 11.6 マップ関数mapconcat6.4 ベクトルvconcat、 5.5 コンスセルとリストの構築のappendを参照。

Function: split-string string separators
stringを正規表現separatorsの一致箇所で区切って 部分文字列に分解する。 separatorsに一致するそれぞれの部分が分割箇所を定義する。 分割箇所のあいだにある部分文字列をリストにまとめ、これを値とする。 separatorsnilである(つまり、省略する)と、 デフォルトは"[ \f\t\n\r\v]+"である。

たとえば、つぎのようになる。

 
(split-string "Soup is good food" "o")
=> ("S" "up is g" "" "d f" "" "d")
(split-string "Soup is good food" "o+")
=> ("S" "up is g" "d f" "d")

文字列の先頭や末尾で一致した場合には、 リストの先頭や末尾に空文字列は現れない。

 
(split-string "out to moo" "o+")
=> ("ut t" " m")

空の一致箇所は、それらが連続していない限り分割点になる。

 
(split-string "Soup is good food" "o*")
=>("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d")
(split-string "Nice doggy!" "")
=>("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!")



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.4 文字列の変更

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Modifying%20Strings"
"elisp/文字列の変更"へのコメント(無し)

既存の文字列の内容を変更するもっとも基本的な方法は、 aset(see 節 6.3 配列操作関数)を使うことです。 (aset string idx char)は、 stringの添字idx位置にcharを格納します。 各文字は1バイト以上を占めます。 charが必要とするバイト数が指定した添字位置の文字が占めるバイト数と 異なる場合には、asetはエラーを通知します。

より強力な関数はstore-substringです。

Function: store-substring string idx obj
この関数は、文字列stringの添字idx位置から始まる部分にobjを 格納することで、文字列stringの内容の一部分を変更する。 引数objは文字であるか(より小さな)文字列。

既存の文字列の長さを変更することは不可能なので、 新たな文字に必要なバイト数がstringの当該箇所の文字のバイト数と 異なるなどして、 objstringの実際の長さに収まらないときにはエラーである。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.5 文字と文字列の比較

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Text%20Comparison"
"elisp/文字と文字列の比較"へのコメント(無し)

Function: char-equal character1 character2
この関数は、引数が同じ文字を表していればtを返し、 さもなければnilを返す。 case-fold-searchnil以外であると、 この関数は大文字小文字の違いを区別しない。

 
(char-equal ?x ?x)
     => t
(let ((case-fold-search nil))
  (char-equal ?x ?X))
     => nil

Function: string= string1 string2
この関数は、2つの文字列の各文字が正確に一致すればtを返す。 大文字小文字を区別する。

 
(string= "abc" "abc")
     => t
(string= "abc" "ABC")
     => nil
(string= "ab" "ABC")
     => nil

関数string=は2つの文字列のテキスト属性を無視する。 equal(see 節 2.6 同値述語)が2つの文字列を比較する際には、 string=を使う。

文字列に非ASCII文字が含まれ、 一方がユニバイトであり他方がマルチバイトである場合、 それらが等しいことはない。 see 節 32.1 テキスト表現

Function: string-equal string1 string2
string-equalstring=の別名。

Function: string< string1 string2
この関数は2つの文字列を1文字ずつ比較する。 まず、文字列を走査し、対応する文字同士の対で一致しないものを探す。 そのような対の文字の小さいほうがstring1の文字であるならば、 string1が小さく、この関数はtを返す。 文字の小さいほうがstring2の文字であるならば、 string1が大きく、この関数はnilを返す。 2つの文字列が完全に一致する場合、値はnilである。

文字の対は、それらの文字コードで比較する。 ASCII文字集合では、小文字は大文字より大きな数値であり、 数字文字や多くの句読点文字は大文字より小さな数値であることに注意。 ASCII文字はどんな非ASCII文字よりも小さい。 ユニバイト非ASCII文字はマルチバイト非ASCII文字よりもつねに小さい。 (see 節 32.1 テキスト表現)。

 
(string< "abc" "abd")
     => t
(string< "abd" "abc")
     => nil
(string< "123" "abc")
     => t

文字列の長さが異なりstring1の長さまで一致する場合、 結果はtである。 string2の長さまで一致する場合、結果はnilである。 空文字列は他のどんな文字列よりも小さい。

 
(string< "" "abc")
     => t
(string< "ab" "abc")
     => t
(string< "abc" "")
     => nil
(string< "abc" "ab")
     => nil
(string< "" "")
     => nil 

Function: string-lessp string1 string2
string-lesspstring<の別名。

Function: compare-strings string1 start1 end1 string2 start2 end2 &optional ignore-case
この関数は、string1の指定部分とstring2の指定部分を比較する。 string1の指定部分は、 添字start1位置から始まり添字end1位置までである (デフォルトは文字列の末尾)。 string2の指定部分は、 添字start2位置から始まり添字end2位置までである (デフォルトは文字列の末尾)。

どちらの文字列も比較のためにマルチバイトに変換するので (see 節 32.1 テキスト表現)、 ユニバイト文字列とマルチバイトが等しくなる場合もある。 ignore-casenilでなければ、大文字小文字を区別しないので、 大文字は小文字に等しくなる

2つの文字列の指定部分が一致すれば、値はt。 さもなければ、値は何文字目までが一致してどちらの文字列が小さいかを示す。 その絶対値は、2つの文字列の始めから一致した文字の個数に1を加えたもの。 string1(の指定部分)が小さいならば符号は負になる。

Function: assoc-ignore-case key alist
この関数は、assocと同様に動作するが、 keyは文字列である必要があり、 compare-stringsを用いて比較する点が異なる。 大文字小文字を区別しないで比較する。

Function: assoc-ignore-representation key alist
この関数は、assocと同様に動作するが、 keyは文字列である必要があり、 compare-stringsを用いて比較する点が異なる。 大文字小文字を区別して比較する。

バッファ内のテキストを比較する 31.3 テキストの比較compare-buffer-substringsも参照してください。 文字列に対して正規表現の一致を取る関数string-matchは、 ある種の文字列比較に使えます。 See 節 33.3 正規表現の探索



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.6 文字と文字列の変換

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=String%20Conversion"
"elisp/文字と文字列の変換"へのコメント(無し)

本節では、文字や文字列と整数のあいだの変換関数について説明します。 formatprin1-to-string(see 節 18.5 出力関数)は、 Lispオブジェクトを文字列に変換するために使えます。 read-from-string(see 節 18.3 入力関数)は、 Lispオブジェクトの文字列表現をオブジェクトに『変換』できます。 関数string-make-multibytestring-make-unibyteは、 文字列のテキスト表現を変換します(see 節 32.2 テキスト表現の変換)。

テキスト文字と一般の入力イベントのテキスト表現を生成する関数 (single-key-descriptiontext-char-description)については、 See 節 23. 説明文。 これらの関数は、主に、ヘルプメッセージの作成に使います。

Function: char-to-string character
この関数は、1つの文字characterだけを含む新たな文字列を返す。 関数stringのほうがより汎用であるので、 この関数はほぼ廃れている。 see 節 4.3 文字列の作成

Function: string-to-char string
この関数は、stringの先頭文字を返す。 文字列が空であると関数は0を返す。 文字列stringの先頭文字が、ASCIIコードが0のナル文字であるときも、 値は0である。

 
(string-to-char "ABC")
     => 65
(string-to-char "xyz")
     => 120
(string-to-char "")
     => 0
(string-to-char "\000")
     => 0

この関数は、存続させるほど有用でなければ、将来、取り除くかもしれない。

Function: number-to-string number
この関数は、numberの表示表現である文字列を返す。 numberは整数か浮動小数点数。 引数が負であれば値の文字列は符号で始まる。

 
(number-to-string 256)
     => "256"
(number-to-string -23)
     => "-23"
(number-to-string -23.5)
     => "-23.5"

int-to-stringは、この関数のほぼ廃れている別名。

4.7 文字列の書式付けformatも参照。

Function: string-to-number string &optional base
この関数は、string内の文字群が表す数値を返す。 basenil以外ならば、これを基数として整数に変換する。 basenilならば10を基数とする。 浮動小数点数の変換はつねに10を基数とする。 浮動小数点数に対しては別の基数を実装していない。 作業量も多くそのわりには有用とも思えないからである。

解析するとき、stringの先頭にある空白やタブは無視し、 数と解釈できる限りをstringから読み取る。 (先頭の空白やタブ以外の他の白文字を無視するシステムもある。) 無視した白文字のあとの最初の文字が、数字文字、プラス記号、 マイナス記号でなければ、この関数は0を返す。

 
(string-to-number "256")
     => 256
(string-to-number "25 is a perfect square.")
     => 25
(string-to-number "X256")
     => 0
(string-to-number "-4.5")
     => -4.5

string-to-intはこの関数の廃れた別名。

文字列へ/から変換するその他の関数を以下にあげておきます。

concat
concatは、ベクトルやリストを文字列へ変換する。 see 節 4.3 文字列の作成

vconcat
vconcatは、文字列をベクトルへ変換する。 see 節 6.5 ベクトル向け関数

append
appendは、文字列をリストへ変換する。 see 節 5.5 コンスセルとリストの構築。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.7 文字列の書式付け

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Formatting%20Strings"
"elisp/文字列の書式付け"へのコメント(無し)

書式付け(formatting)とは、 定数文字列内のさまざま部分を計算値で置き換えた文字列を作ることです。 この文字列は、文字列自体に加えて、 他の値をどのように表示するかも制御します。 この文字列を書式付け文字列(format string)と呼びます。

書式付けは、表示するメッセージを計算する場合に便利です。 実際、関数messageと関数errorには、 ここで説明するのと同じ書式付け機能があります。 それらとformatとの違いは、 書式付けした結果をどのように利用するかです。

Function: format string &rest objects
この関数は、stringをコピーし、 コピー内の書式付け指定を対応するobjectsの表現で置き換えた 新たな文字列を返す。 引数objectsは書式付けすべき計算値である。

書式付け指定は`%'で始まる文字の列です。 したがって、string内に`%d'があると、 関数formatはそれを書式付けすべき値の1つ (引数objectsの1つ)の表示表現で置き換えます。 たとえば、つぎのとおりです。

 
(format "The value of fill-column is %d." fill-column)
     => "The value of fill-column is 72."

stringに2個以上の書式付け指定がある場合、 書式付け指定はobjectsの後続の値に対応します。 つまり、stringの最初の書式付け指定は最初の値を使い、 2番目の書式付け指定は2番目の値を使い、といった具合です。 (値が対応しない)余計な書式付け指定は、 予測不可能なふるまいを引き起こします。 余計な値は無視します。

特定の書式付け指定は、特定の型の値を必要とします。 要求に適合しない値を読者が指定するとエラーを通知します。

有効な書式付け指定をつぎに示します。

`%s'
書式付け指定をオブジェクトのクォートしない (つまり、prin1ではなくprincを用いる。see 節 18.5 出力関数) 表示表現で置き換える。 したがって、文字列は`"'文字なしでその内容を表示し、 シンボルは`\'文字なしで表示する。

対応するオブジェクトがなければ空文字列を使う。

`%S'
書式付け指定をオブジェクトのクォートした (つまり、prin1を用いる。see 節 18.5 出力関数) 表示表現で置き換える。 したがって、文字列は`"'文字で囲んで表示し、 シンボルは特別な文字のまえには`\'文字を付けて表示する。

対応するオブジェクトがなければ空文字列を使う。

`%o'
書式付け指定を整数の基数8の表示表現で置き換える。

`%d'
書式付け指定を整数の基数10の表示表現で置き換える。

`%x'
書式付け指定を整数の基数16の表示表現で置き換える。

`%c'
書式付け指定を指定値の文字で置き換える。

`%e'
書式付け指定を浮動小数点数の指数表記で置き換える。

`%f'
書式付け指定を浮動小数点数の小数点表記で置き換える。

`%g'
書式付け指定を浮動小数点数の指数表記か小数点表記のどちらか短いほうで 置き換える。

`%%'
文字列に1個の`%'を入れる。 この書式付け指定は、値を使わない点で特別である。 たとえば、(format "%% %d" 30)"% 30"を返す。

上記以外の書式付け文字は、エラー`Invalid format operation'になります。

例をいくつか示します。

 
(format "The name of this buffer is %s." (buffer-name))
     => "The name of this buffer is strings.texi."

(format "The buffer object prints as %s." (current-buffer))
     => "The buffer object prints as strings.texi."

(format "The octal value of %d is %o, 
         and the hex value is %x." 18 18 18)
     => "The octal value of 18 is 22, 
         and the hex value is 12."

すべての書式付け文字には、`%'とその文字のあいだに、 数前置子を指定できます。 省略可能な数前置子はオブジェクトの最小幅を指定します。 オブジェクトの表示表現がこの幅より小さい場合、パディングします。 数前置子が正ならば(あるいはゼロで始まれば)左側にパディングし、 数前置子が負ならば右側にパディングします。 パディング文字は、通常、空白ですが、 数前置子がゼロで始まれば、ゼロでパディングします。 パディングの例を示します。

 
(format "%06d is padded on the left with zeros" 123)
     => "000123 is padded on the left with zeros"

(format "%-6d is padded on the right" 123)
     => "123    is padded on the right"

formatは、どんな幅を指定しても、 オブジェクトの表示表現を切り詰めることはありません。 つまり、情報を失うことなく、数前置子を使って最小の桁幅を指定できます。

つぎの3つの例において、`%7s'は最小幅7を指定します。 最初の例では、`%7s'に置き換わる文字列は3文字ですから、 パディングとして空白4個を挿入します。 2番目の例では、文字列"specification"は13文字幅ですが切り詰めません。 3番目の例では、右側にパディングします。

 
(format "The word `%7s' actually has %d letters in it."
        "foo" (length "foo"))
     => "The word `    foo' actually has 3 letters in it."  

(format "The word `%7s' actually has %d letters in it."
        "specification" (length "specification")) 
     => "The word `specification' actually has 13 letters in it."  

(format "The word `%-7s' actually has %d letters in it."
        "foo" (length "foo"))
     => "The word `foo    ' actually has 3 letters in it."  



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.8 Lispの大文字小文字変換

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Case%20Conversion"
"elisp/Lispの大文字小文字変換"へのコメント(無し)

大文字小文字変換関数は、1文字や文字列内の大文字小文字を変更します。 関数は、通常、アルファベット文字 (非ASCII文字のアルファベットに加えて、 `A'から`Z'と`a'から`z')だけを変換します。 それ以外の文字は変わりません。 (大文字小文字テーブルを指定して異なる大文字小文字変換を指定できる。 see 節 4.9 大文字小文字テーブル

これらの関数は、引数として渡した文字列は変更しません。

以下の例では、文字`X'と`x'を使います。 ASCIIコードは、それぞれ、88と120です。

Function: downcase string-or-char
この関数は、文字や文字列を小文字に変換する。

downcaseの引数が文字列であると、 この関数は、引数の各文字の大文字を小文字に変換した新たな文字列を作成する。 downcaseの引数が文字であると、 downcaseは対応する小文字を返す。 この値は整数である。 もとの文字が小文字であったりアルファベット文字でなければ、 値はもとの文字に等しい。

 
(downcase "The cat in the hat")
     => "the cat in the hat"

(downcase ?X)
     => 120

Function: upcase string-or-char
この関数は、文字や文字列を大文字に変換する。

upcaseの引数が文字列であると、 この関数は、引数の各文字の小文字を大文字に変換した新たな文字列を作成する。

upcaseの引数が文字であると、 upcaseは対応する大文字を返す。 この値は整数である。 もとの文字が大文字であったりアルファベット文字でなければ、 値はもとの文字に等しい。

 
(upcase "The cat in the hat")
     => "THE CAT IN THE HAT"

(upcase ?x)
     => 88

Function: capitalize string-or-char
この関数は、文字列や文字をキャピタライズ(先頭文字だけを大文字に)する。 string-or-charが文字列ならば、 この関数は、string-or-charのコピーの各単語をキャピタライズしたものを 内容とする新たな文字列を作成して返す。 つまり、各単語の先頭文字だけを大文字にして残りを小文字にする。

単語の定義は、現在の構文テーブル(See 節 34.2.1 構文クラス一覧)において 単語構成文字に分類された文字が連続した列である。

capitalizeの引数が文字の場合には、 capitalizeupcaseの結果と同じである。

 
(capitalize "The cat in the hat")
     => "The Cat In The Hat"

(capitalize "THE 77TH-HATTED CAT")
     => "The 77th-Hatted Cat"

(capitalize ?x)
     => 88

Function: upcase-initials string
この関数は、string内の単語の先頭文字だけを大文字にし、 先頭文字以外の文字は変更しない。 この関数は、stringのコピーの各単語の先頭文字を大文字に変換したものを 内容とする新たな文字列を返す。

単語の定義は、現在の構文テーブル(See 節 34.2.1 構文クラス一覧)において 単語構成文字に分類された文字が連続した列である。

 
(upcase-initials "The CAT in the hAt")
     => "The CAT In The HAt"

文字列を比較する関数については、See 節 4.5 文字と文字列の比較。 これらは、大文字小文字を区別しないものもあれば、 場合によって大文字小文字を区別しないものもある。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

4.9 大文字小文字テーブル

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Case%20Tables"
"elisp/大文字小文字テーブル"へのコメント(無し)

特別な大文字小文字テーブル(case table)をインストールすれば、 大文字小文字変換をカスタマイズできます。 大文字小文字テーブルは、大文字と小文字の対応関係を指定します。 このテーブルは、Lispオブジェクトの大文字小文字変換関数(前節参照)と バッファ内のテキストに作用する大文字小文字変換関数(see 節 31.18 大文字小文字の変更)の 両方に影響します。 各バッファごとに大文字小文字テーブルがあります。 新たなバッファの大文字小文字テーブルを初期化するために使う 標準の大文字小文字テーブルもあります。

大文字小文字テーブルは、サブタイプがcase-tableである 文字テーブル(see 節 6.6 文字テーブル)です。 この文字テーブルは、各文字を対応する小文字に対応付けます。 これには3つの追加スロットがあり、関連するテーブルを保持します。

upcase
upcase(大文字)テーブルは、各文字を対応する大文字に対応付ける。
canonicalize
canonicalize(正則)テーブルは大文字小文字に関連する1組の文字群を その文字群の特定のメンバに対応付ける。
equivalences
equivalences(同値)テーブルは、大文字小文字に関連する1組の文字群の各要素を その文字群内のつぎの文字に対応付ける。

単純な場合、必要なことは、小文字への対応付けを指定するだけです。 関連する3つのテーブルはこの対応付けから自動的に計算されます。

言語によっては、大文字と小文字の対応関係が1対1でないことがあります。 2つの異なる小文字が同じ大文字に対応することがあります。 このような場合、大文字から小文字への対応付けと、 小文字から大文字への対応付けの両方を指定する必要があります。

追加のテーブルcanonicalize(正則)は、各文字を正則文字に対応付けます。 2つの任意の文字が大文字小文字変換で関連付けられている場合、 その2つの文字は同一の正則文字を持ちます。 たとえば、`a'と`A'は、大文字小文字変換で関連付けられているので、 これらは同一の正則文字を持つはずです (両方の文字に対して`a'であるか、両方の文字に対して`A'である)。

追加のテーブルequivalences(同値)は、 同じ正則クラス(同一の正則文字を持つ文字群)の文字を巡回して対応付けます。 (普通のASCIIでは、`a'を`A'に対応付け、 `A'を`a'に対応付ける。 各正則クラスについても同様。)

大文字小文字テーブルを作成するときには、 canonicalize(正則)にはnilを指定できます。 そうすると、Emacsはこのスロットを小文字と大文字の対応付けから埋めます。 equivalences(同値)にもnilを指定できます。 そうすると、Emacsはこのスロットをcanonicalize(正則)から埋めます。 実際に使用している大文字小文字テーブルでは、 これらの要素はnil以外です。 canonicalize(正則)を指定せずに equivalences(同値)を指定しないでください、

つぎに、大文字小文字テーブルを操作する関数を示します。

Function: case-table-p object
この述語は、objectが正しい 大文字小文字テーブルならばnil以外を返す。

Function: set-standard-case-table table
この関数は、tableを標準の大文字小文字テーブルとし、 これ以降に作成する任意のバッファに使用できるようにする。

Function: standard-case-table
これは、標準の大文字小文字テーブルを返す。

Function: current-case-table
この関数は、カレントバッファの大文字小文字テーブルを返す。

Function: set-case-table table
これは、カレントバッファの大文字小文字テーブルをtableとする。

以下の3つ関数は、非ASCII文字集合を定義するパッケージ向けの 便利なサブルーティンです。 これらは、指定した大文字小文字テーブルcase-tableを変更します。 さらに、標準の構文テーブルも変更します。 See 節 34. 構文テーブル。 普通、標準の大文字小文字テーブルを変更するためにこれらの関数を使います。

Function: set-case-syntax-pair uc lc case-table
この関数は対応する大文字と小文字を指定する。

Function: set-case-syntax-delims l r case-table
この関数は、文字lrを 大文字小文字不変区切りの対応する対にする。

Function: set-case-syntax char syntax case-table
この関数は、charを構文syntaxの大文字小文字不変にする。

コマンド: describe-buffer-case-table
このコマンドは、カレントバッファの大文字小文字テーブルの内容を記述する。


[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]