Home
文字列の亜種であるcharseq構造体を提供するパッケージ。
charseqには、以下のような特徴がある。
- charseq構造体はソース文字列および開始位置、終端位置から構成されている。
- 部分文字列の作成が容易: ソース文字列は共有し、開始位置および終端位置を変更したcharseqを作成するだけで良い。
- 使用者は、個々のcharseqが別の文字列の部分文字列かどうかを意識することなく、完全な一つの文字列として扱うことが可能。 ※ ソース文字列に対して破壊的な操作を行う場合は、共有関係に気をつける必要がある。
- charseqが保持するソース文字列の型は、(simple-array character *)であることが保証されている。
つまり、「特定の文字列の部分文字列を扱う必要がある」あるい「文字列を効率的に処理する必要がある」ようなプログラムで、その煩雑な部分をユーザから切り離し、簡便なインターフェースを提供するのがcharseqの目標。
0.1.8
Common Lisp対応の処理系ならば動作可能なはず。
ただし、SBCL(1.0.37以降)向けにのみ最適化されているため、他の処理系では十分な性能が発揮されないと思われる。
charseq構造体は、その作成時に渡されたソース文字列を、内部的に(simple-array character *)型として保持している。
ソース文字列の型がこれに等しい場合は特に問題がないが、異なる場合は構造体作成時に等価な(simple-array character *)の文字列が作成されることになるので注意が必要。
また、同様の理由から、charseq構造体作成時に渡したソース文字列を、charseqインスタンスが共有するかどうかは不定なので、それに依存したプログラムは書かないことが推奨される。
(asdf-install:install :charseq)
— Type: charseq
— Type: index
(integer 0 #.array-total-size-limit)
— Condition: invalid-index-error
範囲外アクセスエラー
— Condition: bounding-indices-bad-error
不正な範囲指定エラー
— Function: make string &key start end
charseqを作成する。
作成されたcharseqの0番目の要素(文字)は(char string start)
に等しく、長さは(- end start)
となる。
string ソース文字列。型が(simple-array character *)の場合は、作成されるcharseqに共有される。
それ以外の場合は、ソース文字列[start..end-1]にstring=で等価な(simple-array charactert *)型の文字列が作成され、charseqに保持される。start ソース文字列内での開始位置。デフォルトは0 end ソース文字列内での終端位置。デフォルトは (length string)
— Function: ref charseq index
インデックスで指定された要素(文字)を返す。
charseq charseq構造体 index 取得したい文字のインデックス
— Function: length charseq
文字列の長さを返す。
charseq charseq構造体
— Function: sub charseq start &optional end
文字列の部分文字列を取得する。
charseq 部分文字列取得対象となるcharseq構造体 start 部分文字列の開始位置 end 部分文字列の終端位置。デフォルトは (length charseq)
— Function: to-string charseq &optional start end
charseq構造体を、(simple-array character *)型の文字列に変換する。
変換後の文字列用の領域は毎回新たにアロケートされる。
charseq charseq構造体 start 変換対象となる範囲の開始位置。デフォルトは0 end 変換対象となる範囲の終端位置。デフォルトは (length charseq)
— Function: = charseq-1 charseq-2
— Function: < charseq-1 charseq-2
— Function: > charseq-1 charseq-2
— Function: /= charseq-1 charseq-2
— Function: <= charseq-1 charseq-2
— Function: >= charseq-1 charseq-2
charseq構造体用の比較関数
— Macro: each (char charseq &optional result-form with-optimize-hack-assertion) &body body
charseqの要素(文字)を先頭から順に走査する。
走査終了後には、 result-form が評価され、その値が返される。
char 走査時に、各時点での文字がバインドされる変数 charseq 走査対象となるcharseq構造体 result-form 走査終了時に評価され、each式全体の戻り値となる式 。デフォルトはnil with-optimize-hack-assertion SBCL用の最適化調整フラグ。デフォルトはnil。
Tが指定された場合、最適化用のassertマクロがコード本体の前に追加され、より高速なマシンコードが生成されることがある。
※使用非推奨body 走査の各時点で実行される処理の本体
— Macro: as-string (string start end) charseq &body body
charseq構造体を通常の文字列として扱えるようにするマクロ。
charseq構造体のソース文字列、その中での開始位置・終了位置が、それぞれ string 、 start 、 end にバインドされた状態で body が実行される。
charseq 対象となるcharseq構造体 string charseq のソース文字列。(simple-array character *) 型 。
※この変数が破壊的に修正された場合、 charseq も影響を受けるので注意start string 内での開始位置 end string 内での終端位置 body 処理の本体
— Macro: with-dynamic-extent (charseq string &key start end) &body body
次の式とほぼ等価。
(let ((charseq (make string :start start :end end)))
,@body)このマクロが使用された場合は、 charseq の束縛が動的エクステントとなる(可能性がある ※正確な動作は処理系に依存する )。