file.filter
- ファイルのフィルタ ¶このモジュールは、フィルター型のコマンド、 すなわち入力を読み込み、処理をして結果を書き出すような場合に 共通するパターンに使えるユーティリティ手続きを提供します。 共通するパターンとは:
{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
(常に出力ファイルを置き換える) です。
{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")
{file.filter
}
file-filter-fold
に似たユーティリティです。
fold
に対するmap
、for-each
に相当します。
手続きprocは二つの引数、入力から読まれたデータと出力ポートを受けとります。
procの結果は、file-filter-map
では集められてリストとして
戻り値となり、file-filter-for-each
では捨てられます。
キーワード引数の意味はfile-filter-fold
と同じです。