#(define (call-with-<> files proc :optional (reader #f))
(cond
[ (input-port? files)
(if reader
(port-for-each proc (cut reader files) )
(proc files) ) ]
[ (string? files)
(call-with-input-file
files
(cut call-with-<> <> proc reader) ) ]
[ (list? files)
(for-each
(lambda (f)
(call-with-<> f proc reader))
files) ]
[else (error "error")]
))
#readerを指定できるようにしてみました。名前はふと思いついたやつをつけてみました。
#あればあったで使いどころはありそう。(filesにリストも非リストも許すところがSchemeっぽくないけど)。名前はこれだときついっすね。Schemeで<>というとcutのイメージが強くて。あと「filesが空だったらstdin」って判断は呼び出し側にさせるってことですよね。(call-with-<> (if (null? (cdr args)) (current-input-port) (cdr args)) ...) てな感じで。
#ワンライナ支援ライブラリをつくるとすれば、こういう風なものがあるといいのかなと思ったのです。
#空のリストの件は、「ワンライナ支援ライブラリ」でparameterなるものを定義すれば、ダイヤモンド演算子っぽい動作をするのかなと。
#parameterを使ったことがないので自信がないです。
#リストと非リストを統合するようなデータ構造、というか型(?)のような仕掛けがあるといいんでしょうか?
#ワンライナーなら仕様の綺麗さよりも短く書けることの方が重要でしょうから、型的な気持ち悪さとかあまり気にしないでいいんじゃないでしょうか。