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
http://practical-scheme.net/wiliki/wiliki2.cgi?leque%3A%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE
cat(1) がこんな風に書けるようになります。
(define (main args) (copy-port (open-input-argf (cdr args)) (standard-output-port)))
GaucheにもRubyみたいなARGFがほしい。
http://k16journal.blogspot.com/2006/09/gaucherubyargf-argfgauchemain-rubyargf.html
Gaucheに用意されている仮想ポートで似たようなものが作れるかもしれない。
(argf (lambda () (port-for-each (lambda (line) (print (regexp-replace #/hello/ line "damn"))) read-line)))
作ってから必ず思う、すでにこんなのは誰かが作っているんではないだろうか。
あああ、まさに誰かが作ってたよ…。
しかも仮想ポートとか高度な技を使って。