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

12.33 file.filter - ファイルのフィルタ

Module: file.filter

このモジュールは、フィルター型のコマンド、 すなわち入力を読み込み、処理をして結果を書き出すような場合に 共通するパターンに使えるユーティリティ手続きを提供します。 共通するパターンとは:

  • 入力は指定されたファイルかポートで、デフォルトはカレント入力ポート。
  • 出力は指定されたファイルかポートで、デフォルトはカレント出力ポート。
  • 出力は一時ファイルに書き出すこともできて、 その場合は処理が終了した時点で指定されたファイルにリネーム。
  • 処理途中でエラーが起こった場合に出力ファイルを削除
Function: file-filter proc :key input output temporary-file keep-output? rename-hook

{file.filter} 二つの引数、入力ポートと出力ポートを引数としてprocを呼び出し、 その結果を返します。 入力ポートと出力ポートはキーワード引数により決定されます。

input

この引数は入力ポートかファイル名を示す文字列でなければなりません。 入力ポートの場合、それはそのままprocに渡されます。 文字列が渡された場合は、そのファイル名を持つファイルを入力用にオープンし、 そのポートがprocに渡され、またこのポートはprocが戻った時に閉じられます。 この引数が省略された場合は、現在の入力ポートが渡されます。

output

この引数は出力ポートかファイル名を示す文字列でなければなりません。 出力ポートの場合、それはそのままprocに渡されます。 文字列が渡された場合は、そのファイル名を持つファイルを出力用にオープンし、 そのポートがprocに渡されます (但し、temporary-file 引数が渡された時はそれに指定されるファイルが一時ファイルとしてオープンされます)。 オープンされたポートはprocが戻った時に閉じられます。 この引数が省略された場合は、現在の出力ポートが渡されます。

temporary-file

値は真偽値か文字列でなければなりません。#fでない値が渡され、 かつ出力がファイルである場合、新たな一時ファイルが出力用に作成されprocに 渡されます。 そしてprocが正常に返って来た時点で、一時ファイルはoutputに指定された ファイルへとリネームされます。

この引数が#tの場合、一時ファイル名は出力ファイル名をもとに作られます。 この引数が文字列の場合はそれがsys-mkstempに渡されます。

もし一時ファイル名が"/""./""../"以外の 文字で始まっていた場合は、outputに与えられたファイル名のディレクトリが 一時ファイルの前に追加されます。

デフォルトの値は#f (一時ファイルを使わない) です。

keep-output?

真の値が与えられた場合、procがエラーになった場合でも出力ファイルを削除しません。 デフォルトでは、出力ファイル(もしくはtemporary-fileが与えられた場合は そのファイル)はエラーの場合には削除されます。

leave-unchanged

一時ファイルを使う場合に、この引数に真の値が与えられると、 出力ファイルが既に存在して一時ファイルに生成された内容と全く同じだった場合に、 出力ファイルをそのままにします。これは、出力ファイルに触ることで何らかの アクションが起きるようになっている場合に(例: make)、 不必要なアクションを起こさないために便利です。 デフォルトの値は#f (常に出力ファイルを置き換える) です。

Function: file-filter-fold proc seed :key reader input output temporary-file keep-output? rename-hook

{file.filter} file-filterの便利なラッパー手続きです。 入力からreaderによって読まれるデータに対して次々にprocを 呼び出します。readerのデフォルトはread-lineです。 procの引数は、読まれたデータ、シード値、出力ポートです。 procは何かを出力することもできますし、値を返せばそれが 次のシード値として受け渡されてゆきます。他のキーワード引数は file-filterにそのまま渡されます。

例えば次のコードは、file.txtを1行づつ読み、#/regexp/に マッチする行を行番号つきで出力します。

(file-filer-fold
  (^[line nc out]
    (when (#/regexp/ line) (format out "~3d: ~a\n" nc line))
    (+ nc 1))
  1 :input "file.txt")
Function: file-filter-map proc :key reader input output temporary-file keep-output? rename-hook
Function: file-filter-for-each proc :key reader input output temporary-file keep-output? rename-hook

{file.filter} file-filter-foldに似たユーティリティです。 foldに対するmapfor-eachに相当します。

手続きprocは二つの引数、入力から読まれたデータと出力ポートを受けとります。 procの結果は、file-filter-mapでは集められてリストとして 戻り値となり、file-filter-for-eachでは捨てられます。

キーワード引数の意味はfile-filter-foldと同じです。



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