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

12.82 text.tree - 怠惰なテキスト構築

Module: text.tree

テキストを生成する場合によく使われるシンプルな手続きを定義します。

プログラムでテキストを生成する場合、テキストの断片をつなぎ合わせて行く操作が 非常に多く現われます。しかし単純にstring-appendを繰り返し 呼んでしまうと、中間結果の文字列を保持するためだけにメモリアロケーションが多発しますし、 途中でエラーが発生した場合にその中間結果は結局捨てられてしまうかもしれません (例えば、CGIスクリプト中でHTMLドキュメントを構築してゆくような場合を考えてみて下さい)。

よく知られた効率の良い方法は、テキストの断片をつなぎ合わせるのを本当に必要に なるまで遅らせることです。Schemeではそれは非常に簡単です。単に断片をコンス していって木構造を作り、最後にそれをトラバースしてテキストを作成するのです。 場合によっては、トラバースしながらテキストを出力すれば事足りてしまうので、 中間結果のバッファを持つ必要さえありません。 (Hans Boehmのガベージコレクションライブラリに附属している “cord” ライブラリ はこのテクニックを実装したもので、エディタ等のアプリケーションで非常に効率良く 動作することが知られています)。

木構造をトラバースする手続きなどほんの2〜3行で書けてしまいますが、 「一度、そして一度だけ」の精神の下に、このモジュールを提供します。 インタフェースが統一されてたほうが便利ですしね。

Generic Function: write-tree tree :optional out

{text.tree} treeをテキストの木構造とみなして、出力ポートoutに出力します。 outが省略された場合は現在の出力ポートが使われます。

下に示す2つのメソッドが定義されています。より複雑な動作をさせたい場合は、 単純なリストの替わりにノードとなるクラスを定義して、それにメソッドを定義するようにすれば 動作をカスタマイズできます。

Method: write-tree ((tree <list>) out)
Method: write-tree ((tree <top>) out)

{text.tree} write-treeの既定の動作です。treeがリストなら、その要素それぞれに ついてwrite-treeを呼び出します。それ以外のオブジェクトに関しては displayを呼んで出力します。

Function: tree->string tree

{text.tree} 出力文字列ポートを作成してwrite-treeを呼び、生成された文字列を返します。



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