gaucheでファイルを一行ずつ読み込む


catコマンドで各行を出力する「-n」オプションをgaucheで実装するためには、一行ずつファイルを読み込まなければなりません。では、逆に今まではどのようにファイルを読み込んでいたかというと、

(copy-port in (current-output-port)))))

という記述の中の「copy-port手続き」を利用して、ファイルを読み込んでいます。 この手続きは

Function: copy-port src dst &keyword (unit 0)
srcからEOFまでデータを読みだし、dstへ書き出します。

Gauche Users’ Reference: Top

というような働きをします。この手続きは、一挙に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手続き」を作用させて出力しています。