次: , 前: Predicates for Strings, 上: Strings and Characters


4.3 文字列の作成

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

— 機能: make-string count character

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

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

この関数に対比するものに、 char-to-string(see String Conversion)、 make-vector(see Vectors)、 make-list(see Building Lists)などがある。

— 機能: string &rest characters

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

          (string ?a ?b ?c)
               => "abc"
     
— 機能: 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 Sequence Functions)。

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

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 Buffer Contents)であり、 カレントバッファ内のテキストの一部を収めた文字列を返す。 文字列の先頭は0で添字付けするが、バッファの先頭は1で添字付けする。

— 機能: 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 Formatting Strings)や number-to-string(see String Conversion)を使うことである。

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

他の連結関数については、 Mapping FunctionsmapconcatVectorsvconcatBuilding Listsappendを参照。

— 機能: 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" "!")