gaucheでファイルを一行ずつ読み込む
catコマンドで各行を出力する「-n」オプションをgaucheで実装するためには、一行ずつファイルを読み込まなければなりません。では、逆に今まではどのようにファイルを読み込んでいたかというと、
(copy-port in (current-output-port)))))
という記述の中の「copy-port手続き」を利用して、ファイルを読み込んでいます。 この手続きは
Function: copy-port src dst &keyword (unit 0)
Gauche Users’ Reference: Top
srcからEOFまでデータを読みだし、dstへ書き出します。
というような働きをします。この手続きは、一挙にEOFまで読み込んでしまうため、今回の各行を出力するという目的には適しません。
そのような訳で、今回各行を一行ずつ読み込むには、readline手続きとport-for-each手続きを利用します。これをcatコマンドに組み入れた例をしめします
(define (main args) (if (null? (cdr args)) (copy-port (current-input-port ) (current-output-port)) (for-each (lambda (file) (call-with-input-file file (lambda (in) (port-for-each print (cut read-line in) )))) (cdr args))) 0)
この「port-for-each手続き」を利用することによって、「read-line手続き」で読み込んだ各行に対して「print手続き」を作用させて出力しています。