Let's start Scheme

2014-05-02

SRFI-13の紹介

(LISP Library 365参加エントリ)

SRFI-13は文字列操作を行う手続きを定義したSRFIです。SRFI-1と同様に超有名なSRFIなので知らない人はいないのではないでしょうか?今回はそんなSRFI-13の中から便利だけど意外と知られてなさそうな手続きを紹介します(RnRSに入っているものは除きます)。

string-tabulate
文字列の構築を行う手続きです。SRFI-1のlist-tabulateとほぼ同じですが、受け取る引数の順番が違います(先に手続きを受け取る)。以下のように使います。
;; make string range 0-255
(string-tabulate integer->char 256)
;; "\x0;\x1;\x2;\x3;\x4;\x5;\x6;\a\b\t\n\v\f\r\xE;\xF;\x10;\x11;\x12;\x13;\x14;\x15;\x16;\x17;\x18;\x19;\x1A;\x1B;\x1C;\x1D;\x1E;\x1F; !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F;\x80;‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ\xFF;"

;; the first argument doesn't have to be integer->string
(string-tabulate (lambda (i) #\a) 256)
;; "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
ランダムな文字列がほしいときとかに使えそうです。

string-take string-take-right
string-drop string-drop-right
SRFI-1にあるtake/dropの文字列版です。使い方を載せるまでもないくらいそのままです。

string-prefix? string-prefix-ci?
string-suffix? string-suffix-ci?
第一引数に与えられた文字列が第二引数に与えられた文字列の接頭文字列・接尾文字列かどうかを判別します。オプションで引数に与えられて文字列の開始位置及び終了位置を指定可能です。-ci?で終わるものは大文字小文字を無視します。
(string-prefix? "http" "http://localhost")
;; #t

(string-prefix? "https" "http://localhost")
;; #f

string-replace
名前のとおり文字列の置き換えを行います。対象文字列、置き換え文字列、開始位置、終了位置を受け取り、新しく文字列を生成します。(破壊的操作ではない)
(string-replace "Hello horrible Scheme" "beautiful" 6 14)
;; "Hello beautiful Scheme"
参照実装ではsubstringしてappendしてるだけだったりします。処理系によっては最適化しているものもあるかもしれません。(ちなみに、Sagittariusは参照実装のままです。組み込みにしてメモリの割付を減らしてもいいかなぁとは思ったりしますが。)

string-tokenize
文字列をトークンに切り出してリストとして返します。オプション引数としてトークンにする文字セットを受け取ることが可能です。 デフォルトの文字セットはchar-set:graphicです。
(string-tokenize "Hello world!!")
;; ("Hello" "world!!")

(string-tokenize "Helloaaaworld!!" (string->char-set "edlowrH"))
;; ("Hello" "world")
文字セットに関する手続きはSRFI-14で定義されています。

その他にもパディングやトリムといった手続きがあるので、興味があれば覗いてみてはどうでしょう?

No comments:

Post a Comment