不確定特異点

広く深く、ところどころ超深く

Common Lisp でバイナリファイルの EOF 判定

ちょっと Common Lisp でバイナリファイルの入力で困ってます。ファイルをオープンしてストリームから read-byte で 1 バイトずつ入力しているときは、EOF にあたるとエラーを返すため、特に問題ないのですが、例えば 4 バイト単位で読んだときに、もしファイルサイズが 4 の倍数でないと中途半端な位置で EOF が来ますが、このとき 4 バイト中で正しく読めた分は受け取り、EOF 以降にエラーになった分は不定でも構わない、という処理を書きたいとします。

まず read-byte で 1 バイト読んで、エラーがなければ 2 バイト目以降も read-byte で読む。もし 2 バイト目以降の read-byte でエラーが起きた場合は、それは EOF を過ぎているため不定値に置き換える、もしくは eof-value を指定した上で read-byte をする。

という感じになるのかな。できなくはないですが、面倒ですし非常に効率を落としている気がします…。

read-sequence という手も考えてみましたが、これは正常に読めた分だけ渡した配列に値を入れてくれるので、この処理には適しているように思えたのですが、困ったことに EOF の判定ができないのです。ではストリーム自体を C の feof みたく判定すればいいじゃん、と思いましたが、Common Lisp にはストリームの EOF 判定がないっぽいんですよね。うーん、何かいい方法はないのか。