各モジュール名は概ね何を実装しているかを示すような名前になっていて、 何のための実装になっているかは示していません。モジュールがひと つの問題を解くためにあるのなら両方は一致しますが、問題の解法が複数ある こともありますし、ひとつのアルゴリズムの実装が複数の異る問題を解くのに 役立つこともあります。したがって、モジュールに問題指向(あるいは目的指 向)の名前を付けることは困難です。
というわけで、Gaucheにはじめてふれるプログラマにとって問題を解くのに適 切なGaucheモジュールを見つけるのは簡単ではないかもしれません。やるべきことに対 応するアルゴリズムは複数ありえますから、それぞれのアルゴリズムは別々の モジュールで実装されています。
モジュールはまた、いくつもの層で実装されています。システムコールへの直接のインタフェース を提供する低レベルモジュールもあれば、複数の低レベルモジュールを使って 構築された、より抽象化され使いやすい高レベルモジュールもあります。さて どれを使えばよいでしょう。通常もっとも高レベルのものを使うのがよいでしょ う。やさしく使える抽象度の高いインタフェースを提供するというのがまさに ライブラリの目的だからです。とはいうものの、場合によっては抽象の壁をや ぶってその下にあるメカニズムに触らなければ出来ないこともあります。そ ういうときには低レベルのモジュールを直接使う必要があります。
ここではライブラリをその目的にしたがってグループ分けします。各カテゴリ ごとに関連するモジュールをあげ、簡単な説明をしています。
似たような性質をもつデータコンテナがあります。たとえば、リスト、ベクタ、 ハッシュテーブルはデータのコレクションとして見ることができます。それゆ え、すべての要素に適用できるようなジェネリックな操作があれば便利です。
Gaucheでは主にオブジェクトシステムで使うためにこのような機構をある程度 用意されています。
gauche.collection
- コレクションフレームワーク参照。
gauche.sequence
- シーケンスフレームワーク参照。
gauche.dictionary
- ディクショナリフレームワーク参照。
util.relation
- リレーションフレームワーク参照。
srfi.42
- 先行評価的内包表記参照。
scheme.list
- R7RSリストをチェックしましょう。
scheme.vector
- R7RSベクタを見ましょう。
広い範囲のインデックスが必要で、しかし実際に格納されるデータが疎である場合は
疎なベクタが使えるかもしれません。
gauche.array
- 配列参照。
gauche.array
- 配列でサポートされている。
srfi.13
- 文字列ライブラリ参照。Gaucheではマルチバイト文字列を扱えます。詳細
についてはマルチバイト文字列を見てください。
scheme.charset
- R7RS文字集合参照。
data.imap
- 変更不可なマップ参照。
data.queue
- キューで用意されています。
スレッドセーフキューはまた、同期的なメッセージチャネルとしても使えます。
data.heap
- ヒープ参照。
data.ring-buffer
- リングバッファ参照。
data.cache
- キャッシュ参照。
gauche.record
- レコード型および
util.record
- SLIB-互換のレコード型を検討するのもいいでしょう。こちらの
方がポータブルで高効率です。
util.stream
- ストリームライブラリ参照。
data.trie
- Trie参照。
dbm
- 汎用DBMインタフェース参照。ジェネリッ
クなRDBMSへのインタフェースについては、
dbi
- データベース非依存アクセス層を見てください。
文字列の基本操作は文字列およびsrfi.13
- 文字列ライブラリでカバーされ
ています。文字列は文字のシーケンスでもありますので、
gauche.collection
- コレクションフレームワークおよびgauche.sequence
- シーケンスフレームワークのメソッドを適
用可能です。
文字および文字集合の操作は
文字、文字集合、scheme.charset
- R7RS文字集合がカ
バーしています。
文字列を先頭から順に操作したり構築したりする場合にはインデックスによる アクセスは行いません。文字列ポート(文字列ポート参照)はさらに 効率のよいエレガントな方法を提供しています。
文字列から文字のならびを検索したり、とりだしたりするのに正規表現が使え ます。正規表現参照。
文字列の低レベル(たとえばバイトレベル)表現を扱う必要があるなら ユニフォームベクタに文字列とバイトベクタ相互の変換をおこなうツール があります。
文字の単なるシーケンスよりも高次の構造を扱いたいのですか。それなら
text.*
モジュールを見てください。text.parse
- 入力ストリームのパージングには
基本的なスキャナの実装が用意されています。
text.tr
- 文字変換はUnixのtr(1)
に似た機能を実装して
います。2つのテキストのdiff
をとることもできます。これについては
text.diff
- テキストストリームの相違点を計算するを見てください。文字列の断片
から大きな文字列を構成したいのなら、string-append
を使ってはいけ
ません。text.tree
- 怠惰なテキスト構築参照。
大事なことを言い忘れました。Gaucheはさまざまな文字エンコーディングをサ
ポートしています。基本的な関数については
gauche.charconv
- 文字コード変換を見てください。open-input-file
のようなもっとも高次の関数のほとんどは、:encoding
キーワード引数
をとり、文字の変換を暗黙におこないます。非ASCII文字でSchemeのプログラ
ムを書きたい場合にはマルチバイトスクリプトを見てください。encodingと
いうマジックコメントを含むGaucheのソースコードを処理したいなら
コーディング認識ポートを見てください。地域化が必要なら、Gaucheには
GNU gettext互換のモジュール(text.gettext
- 地域化メッセージ)もあります。
ほとんどのプログラムでは外界(他のプログラムや人間)とコミュニケーション する必要があります。ということは外部データを読み込んでそれがどのような フォーマットで書かれているかを判別したり、他のプログラムが理解できる フォーマットでデータを書き出したりするということです。
ネットワークに関連する外部フォーマットの多くはRFCで規定されており、そ
れらのいくつかに対応するRFCモジュール(rfc.*
)があります。たとえ
ばよく知られたRFC2822のメッセージフォーマットを処理するには
rfc.822
- RFC822メッセージ形式を見てください。
表形式のデータを交換するのにもっとも便利な方法は表の一行をプレーンテキ
ストの一行に対応させることです。そしてカラムは特定の文字で区切ります。
たとえば、コンマで区切ります。これらの解析と書き出し用の基本手続につい
てはtext.csv
- CSVテーブルを見てください。
今どきのビジネスユーザはXMLを欲しがるというのですか。いいでしょう。まぁ
彼らが欲しいのは尖った括弧のえらい冗長なS式なんですから、XMLをS式と
して読み込んで、自家籠中の car とか cdr とか map でちょちょいと処理し
てえらい冗長な尖った括弧で書き出せばいいですよね。
sxml.ssax
モジュール(sxml.ssax
- 関数的なXMLパーザ)はSAX XMLパーザ
の実装です。これを使えば、おてがるにXMLをパーズしたり処理したり、ある
いはまた、SXML(S式XML)に変換することもできます。SXPath(XPathに対応する
S式(sxml.sxpath
- SXMLクエリ言語))を使ってSXMLクエリを発行することもでき
ます。SXMLシリアライザを使えば、すべての種類のXMLやHTMLをはきだすこと
もできます(sxml.serializer
- SXMLからXMLとXHTMLのシリアライゼーション)。
(でもいまどきのwebサービスならたいていはJSONも話しますし、そっちの方が
手軽だっていうなら、rfc.json
- JSONのパーズと構築を見てみると良いかも
しれません。)
さまざまなファイルフォーマットを処理するルーチンをfile.*
という
モジュールで使えるようにしようという計画はあるのですが、まだなにも準備
できていません。ひとつ自分で書いてやろうという人がいたら是非おねがいし
たいので、おしらせ下さい。
ファイルおよびディレクトリ。おおざっぱに言うと見るべきところは2箇所で す。
ファイルシステムのコア部分には下位のOSが提供しているに近いルーチンが
あります。Unixのシステムプログラミングの経験があれば、よく知っている関
数名がばかりだと思うでしょう。ちなみにfcntl
の機能は
gauche.fcntl
(gauche.fcntl
- 低レベルファイル操作)にあります。
まちがいなくfile.util
(file.util
- ファイルシステムユーティリティ)を使いたいこと
でしょう。これはシステムレベル上で実装された高次レベルのルーチン群です。
プロセス関連のルーチンも2つのレベルで提供されます。
gauche.process
モジュールは高レベルのルーチン
(gauche.process
- 高レベルプロセスインタフェース)を提供しています。これを使えば、た
とえば、データを子プロセスとの間でパイプすることが簡単にできます。
Gaucheコアはプリミティブなfork
およびexec
のインタフェース
を、便利なsystem
コール(プロセス管理参照)同様提
供しています。やりたいことを細かくコントロールしたい場合に使うとよいで
しょう。
GaucheはOSXを含む多くのUnixプラットフォームでプリエンプティブなスレッドを
サポートしています。低レベルの排他制御を含む基本的なスレッドのサポートについては
gauche.threads
- スレッドを参照してください。data.queue
モジュール
(data.queue
- キュー参照)では、スレッド間同期にも使えるスレッドセーフなキューを
提供しています。スレッドプールはcontrol.thread-pool
(control.thread-pool
- スレッドプール参照)
によって提供されます。
これは抽象の層が複数あります。最下層ではソケットレベルのシステムコール に対応するAPIがあります。中間層ではホスト名の解決、コネクション、シャッ トダウンなどを自動でやるような便利なライブラリになっています。最上層で は、たとえばHTTPのような特定のプロトコルを扱うためのモジュールがいくつ か用意されています。
gauche.net
モジュール(gauche.net
- ネットワーキング)は最下層と中間層を提供し
ています。最上層についてはrfc.*
モジュールを探してみて下さい。
たとえば rfc.http
(rfc.http
- HTTPクライアント)です。
その他のプロトコルについてもまもなくサポートされる予定です。
rfc.ftp
やrfc.imap4
はすでにユーザの方々が書いてくれていて、
Gaucheにとりこまれるのを待っている状態にあります。おそらく次のリリース
で統合されるでしょう。
さらに複数のプロトコルを抽象化してnet.*
という名前のさらに高次レ
ベルのライブラリの計画もあります。emailの送信あるいはURIによるリソース
アクセスなどの計画があります。コードの貢献は歓迎します。
最下層としてGaucheはコアに含まれるブロック入出力(read-uvector
, read-uvector!
、write-uvector
)と同様、バイト入出力のプリミティブ
(read-byte
、write-byte
)も含んでいます
(データの読み込み、出力、ユニフォームベクタのブロック入出力参照)。
中間層としては、binary.io
(binary.io
- バイナリI/O)モジュールには
オプションでエンディアンを指定できる特定のデータを取得するルーチンがあ
ります。
そして最上層としては、binary.pack
(binary.pack
- バイナリデータのパック)
モジュールがあって、構造をもつバイナリデータのパック、アンパックを可能
にしています。Perlでいうpack
/unpack
です。
Gaucheコアは基本的なビットシフトおよびマスク操作を提供しています
(基本的なビット演算参照)。
SRFI-151はより包括的なビット演算を提供します
(scheme.bitwise
- R7RSビット演算参照)。