Mercury 勉強メモ

関数論理型言語 Mercury を勉強するブログです.

よく使う述語: 文字列編

Mercury の標準ライブラリから, 文字列に関連するよく使いそうな述語をピックアップしました.

基本操作

string.length

:- func string.length(string::in) = (int::uo) is det.
:- pred string.length(string::in, int::uo) is det.

文字列の長さを返す.

string.append

:- func string.append(string::in, string::in) = (string::uo) is det.
:- pred string.append(string, string, string).
:- mode string.append(in, in, in) is semidet.
:- mode string.append(in, uo, in) is semidet.
:- mode string.append(in, in, uo) is det.
:- mode string.append(out, out, in) is multi.

2つの文字列を連結する.

(list) ++

:- func string ++ string = string.

2つの文字列を連結する.

string.index

:- pred string.index(string::in, int::in, char::uo) is semidet.

文字列のn番目の文字を返す.

(list) ^elem

:- func string ^ elem(int) = char.

文字列のn番目の文字を返す.

string.append_list

:- func string.append_list(list(string)::in) = (string::uo) is det.
:- pred string.append_list(list(string)::in, string::uo) is det.

文字のリストを連結して文字列にする.

string.hash

:- func string.hash(string) = int.

文字列のハッシュ値を求める.

変換操作

string.char_to_string

:- func string.char_to_string(char::in) = (string::uo) is det.
:- pred string.char_to_string(char, string).
:- mode string.char_to_string(in, uo) is det.
:- mode string.char_to_string(out, in) is semidet.

文字を文字列に変換する.

string.from_char

:- func string.from_char(char::in) = (string::uo) is det.

文字を文字列に変換する.

string.to_char_list

:- func string.to_char_list(string) = list(char).
:- pred string.to_char_list(string, list(char)).
:- mode string.to_char_list(in, out) is det.
:- mode string.to_char_list(uo, in) is det.

文字列を文字のリストに変換する.

string.from_char_list

:- func string.from_char_list(list(char)::in) = (string::uo) is det.
:- pred string.from_char_list(list(char), string).
:- mode string.from_char_list(in, uo) is det.
:- mode string.from_char_list(out, in) is det.

文字のリストを文字列に変換する.

string.int_to_string

:- func string.int_to_string(int::in) = (string::uo) is det.
:- pred string.int_to_string(int::in, string::uo) is det.

整数を文字列に変換する.

string.from_int

:- func string.from_int(int::in) = (string::uo) is det.

整数を文字列に変換する.

string.to_int

:- pred string.to_int(string::in, int::out) is semidet.

文字列を整数に変換する.

string.float_to_string

:- func string.float_to_string(float::in) = (string::uo) is det.
:- pred string.float_to_string(float::in, string::uo) is det.

浮動小数点数を文字列に変換する.

string.from_float

:- func string.from_float(float::in) = (string::uo) is det.

浮動小数点数を文字列に変換する.

string.to_float

:- func string.det_to_float(string) = float.

文字列を浮動小数点数に変換する.

検索

string.sub_string_search

:- pred string.sub_string_search(string::in, string::in, int::out) is semidet.

文字列から部分文字列を検索してインデックスを返す.

string.sub_string_search_start

:- pred string.sub_string_search_start(string::in, string::in, int::in, int::out) is semidet.

文字列から部分文字列を検索開始位置を指定して検索しインデックスを返す.

置換

string.replace

:- pred string.replace(string::in, string::in, string::in, string::uo) is semidet.

replace(S1, S2, S3, S4) で,S1中で最初に見つかったS2S3に置き換えた文字列S4を返す.

string.replace_all

:- pred string.replace(string::in, string::in, string::in, string::uo) is semidet.

replace(S1, S2, S3, S4) で,S1中のすべてのS2S3に置き換えた文字列S4を返す.

string.set_char

:- pred string.set_char(char, int, string, string).
:- mode string.set_char(in, in, in, out) is semidet.

set_char(C, N, S0, S1)で文字列S0N番目の文字をCに置き換えた文字列S1を返す.

分割

string.words

:- func string.words(string) = list(string).

文字列を単語に分解してリストにして返す.

string.split

:- pred string.split(string::in, int::in, string::out, string::out) is det.

文字列をn番目で分割する

string.between

:- func string.between(string::in, int::in, int::in) = (string::uo) is det.
:- pred string.between(string::in, int::in, int::in, string::uo) is det.

文字列のn番目(含む)からm番目(含まない)までを取り出す.

整形

string.strip

:- func string.lstrip(string) = string.

文字列の前後の空白文字を除去する.

string.duplicate_char

:- func string.duplicate_char(char::in, int::in) = (string::uo) is det.
:- pred string.duplicate_char(char::in, int::in, string::uo) is det.

文字をn回繰り返した文字列を作る.

string.format

:- type string.poly_type ---> f(float); i(int); s(string); c(char).
:- func string.format(string, list(string.poly_type)) = string.
:- pred string.format(string::in, list(string.poly_type)::in, string::out) is det.

フォーマットを指定して文字列を作る.

文字 形式
d, i int 符号付き整数
o int 符号付き8進整数
x, X int 符号付き16進整数
u int 符号無し整数
c char 文字
s string 文字列
f float 浮動小数点数
e, E char 浮動小数点数の科学表記
g, G char 浮動小数点数の科学表記(小数点とその後の0が省略される)
p int 値を整数を出力

C言語同様に,フラグ(0+-#)フィールド長(または*),精度(.*も可)も指定できる.

string.format_table

:- type justified_column ---> left(list(string)); right(list(string)).
:- func string.format_table(list(justified_column), string) = string.

文字列の表を作る. 例えば,

format_table([right(["a", "bb", "ccc"]), left(["1", "22", "333"])], " * ")

は,

  a * 1
 bb * 22
ccc * 333

という文字列になる.

string.format_table_max

:- func string.format_table_max(assoc_list(justified_column, maybe(int)), string) = string.

format_tableと同じだが,列の最大幅を指定できる.

string.word_wrap

:- func string.word_wrap(string, int) = string.

長い文字列を指定した幅に収まるように改行を加えた文字列を返す.