Skip to content
sile edited this page Sep 14, 2010 · 27 revisions

概要

文字列の亜種であるcharseq構造体を提供するパッケージ。
charseqには、以下のような特徴がある。

  1. charseq構造体はソース文字列および開始位置、終端位置から構成されている。
    • 部分文字列の作成が容易: ソース文字列は共有し、開始位置および終端位置を変更したcharseqを作成するだけで良い。
    • 使用者は、個々のcharseqが別の文字列の部分文字列かどうかを意識することなく、完全な一つの文字列として扱うことが可能。 ※ ソース文字列に対して破壊的な操作を行う場合は、共有関係に気をつける必要がある。
  2. 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)

API

— 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構造体のソース文字列、その中での開始位置・終了位置が、それぞれ stringstartend にバインドされた状態で 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 の束縛が動的エクステントとなる(可能性がある ※正確な動作は処理系に依存する )。