ARGF

RubyのARGFと似たようなことを、Gaucheでやってみる。

(define-module argf (export with-argf))
(select-module argf)
(define (with-argf args thunk)
  (if (null? args) (thunk)
    (for-each (lambda (f) (with-input-from-file f thunk)) args)))
(provide "argf")

argf.scmとして*load-path*に保存。
これを使ってcatを書くとこんな感じ。

% gosh cat.scm cat.scm
(use argf)
(define (cat) (port-for-each print read-line))
(define (main args) (with-argf (cdr args) cat))
% echo aaa | gosh cat.scm
aaa

Ruby の ARGF 風の port。argf.scm
cat(1) がこんな風に書けるようになります。
(define (main args) (copy-port (open-input-argf (cdr args)) (standard-output-port)))

http://practical-scheme.net/wiliki/wiliki2.cgi?leque%3A%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE

GaucheにもRubyみたいなARGFがほしい。
Gaucheに用意されている仮想ポートで似たようなものが作れるかもしれない。
(argf (lambda () (port-for-each (lambda (line) (print (regexp-replace #/hello/ line "damn"))) read-line)))
作ってから必ず思う、すでにこんなのは誰かが作っているんではないだろうか。

http://k16journal.blogspot.com/2006/09/gaucherubyargf-argfgauchemain-rubyargf.html

あああ、まさに誰かが作ってたよ…。
しかも仮想ポートとか高度な技を使って。