For Development HEAD DRAFTSearch (procedure/syntax/module):

8.1 必要なライブラリの探し方

各モジュール名は概ね何を実装しているかを示すような名前になっていて、 何のための実装になっているかは示していません。モジュールがひと つの問題を解くためにあるのなら両方は一致しますが、問題の解法が複数ある こともありますし、ひとつのアルゴリズムの実装が複数の異る問題を解くのに 役立つこともあります。したがって、モジュールに問題指向(あるいは目的指 向)の名前を付けることは困難です。

というわけで、Gaucheにはじめてふれるプログラマにとって問題を解くのに適 切なGaucheモジュールを見つけるのは簡単ではないかもしれません。やるべきことに対 応するアルゴリズムは複数ありえますから、それぞれのアルゴリズムは別々の モジュールで実装されています。

モジュールはまた、いくつもの層で実装されています。システムコールへの直接のインタフェース を提供する低レベルモジュールもあれば、複数の低レベルモジュールを使って 構築された、より抽象化され使いやすい高レベルモジュールもあります。さて どれを使えばよいでしょう。通常もっとも高レベルのものを使うのがよいでしょ う。やさしく使える抽象度の高いインタフェースを提供するというのがまさに ライブラリの目的だからです。とはいうものの、場合によっては抽象の壁をや ぶってその下にあるメカニズムに触らなければ出来ないこともあります。そ ういうときには低レベルのモジュールを直接使う必要があります。

ここではライブラリをその目的にしたがってグループ分けします。各カテゴリ ごとに関連するモジュールをあげ、簡単な説明をしています。


8.1.1 ライブラリディレクトリ - データコンテナ

ジェネリックなコンテナ操作

似たような性質をもつデータコンテナがあります。たとえば、リスト、ベクタ、 ハッシュテーブルはデータのコレクションとして見ることができます。それゆ え、すべての要素に適用できるようなジェネリックな操作があれば便利です。

Gaucheでは主にオブジェクトシステムで使うためにこのような機構をある程度 用意されています。

コンテナの実装


8.1.2 ライブラリディレクトリ - 文字列と文字

文字列の基本操作は文字列および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 - 地域化メッセージ)もあります。


8.1.3 ライブラリディレクトリ - データ交換

ほとんどのプログラムでは外界(他のプログラムや人間)とコミュニケーション する必要があります。ということは外部データを読み込んでそれがどのような フォーマットで書かれているかを判別したり、他のプログラムが理解できる フォーマットでデータを書き出したりするということです。

ネットワークに関連する外部フォーマットの多くは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.*という モジュールで使えるようにしようという計画はあるのですが、まだなにも準備 できていません。ひとつ自分で書いてやろうという人がいたら是非おねがいし たいので、おしらせ下さい。


8.1.4 ライブラリディレクトリ - ファイル

ファイルおよびディレクトリ。おおざっぱに言うと見るべきところは2箇所で す。

ファイルシステムのコア部分には下位のOSが提供しているに近いルーチンが あります。Unixのシステムプログラミングの経験があれば、よく知っている関 数名がばかりだと思うでしょう。ちなみにfcntlの機能は gauche.fcntl (gauche.fcntl - 低レベルファイル操作)にあります。

まちがいなくfile.util(file.util - ファイルシステムユーティリティ)を使いたいこと でしょう。これはシステムレベル上で実装された高次レベルのルーチン群です。


8.1.5 ライブラリディレクトリ - プロセスとスレッド

プロセス関連のルーチンも2つのレベルで提供されます。

gauche.processモジュールは高レベルのルーチン (gauche.process - 高レベルプロセスインタフェース)を提供しています。これを使えば、た とえば、データを子プロセスとの間でパイプすることが簡単にできます。

Gaucheコアはプリミティブなforkおよびexecのインタフェース を、便利なsystemコール(プロセス管理参照)同様提 供しています。やりたいことを細かくコントロールしたい場合に使うとよいで しょう。

GaucheはOSXを含む多くのUnixプラットフォームでプリエンプティブなスレッドを サポートしています。低レベルの排他制御を含む基本的なスレッドのサポートについては gauche.threads - スレッドを参照してください。data.queueモジュール (data.queue - キュー参照)では、スレッド間同期にも使えるスレッドセーフなキューを 提供しています。スレッドプールはcontrol.thread-pool (control.thread-pool - スレッドプール参照) によって提供されます。


8.1.6 ライブラリディレクトリ - ネットワーク

これは抽象の層が複数あります。最下層ではソケットレベルのシステムコール に対応するAPIがあります。中間層ではホスト名の解決、コネクション、シャッ トダウンなどを自動でやるような便利なライブラリになっています。最上層で は、たとえばHTTPのような特定のプロトコルを扱うためのモジュールがいくつ か用意されています。

gauche.netモジュール(gauche.net - ネットワーキング)は最下層と中間層を提供し ています。最上層についてはrfc.*モジュールを探してみて下さい。 たとえば rfc.http (rfc.http - HTTPクライアント)です。 その他のプロトコルについてもまもなくサポートされる予定です。 rfc.ftprfc.imap4はすでにユーザの方々が書いてくれていて、 Gaucheにとりこまれるのを待っている状態にあります。おそらく次のリリース で統合されるでしょう。

さらに複数のプロトコルを抽象化してnet.*という名前のさらに高次レ ベルのライブラリの計画もあります。emailの送信あるいはURIによるリソース アクセスなどの計画があります。コードの貢献は歓迎します。


8.1.7 ライブラリディレクトリ - 入出力


8.1.8 ライブラリディレクトリ - 時間


8.1.9 ライブラリディレクトリ - ビットとバイト

バイナリ入出力

最下層としてGaucheはコアに含まれるブロック入出力(read-uvector, read-uvector!write-uvector)と同様、バイト入出力のプリミティブ (read-bytewrite-byte)も含んでいます (データの読み込み出力ユニフォームベクタのブロック入出力参照)。

中間層としては、binary.io(binary.io - バイナリI/O)モジュールには オプションでエンディアンを指定できる特定のデータを取得するルーチンがあ ります。

そして最上層としては、binary.pack(binary.pack - バイナリデータのパック) モジュールがあって、構造をもつバイナリデータのパック、アンパックを可能 にしています。Perlでいうpack/unpackです。

ビット操作

Gaucheコアは基本的なビットシフトおよびマスク操作を提供しています (基本的なビット演算参照)。 SRFI-151はより包括的なビット演算を提供します (scheme.bitwise - R7RSビット演算参照)。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT