;;; argf.scm - Ruby like ARGF port ;;; ;;; Copyright (c) 2005 OOHASHI Daichi, All rights reserved. ;;; (define-module argf (use gauche.vport) (export open-input-argf)) (select-module argf) (define (open-input-argf files) (let* ((f (if (null? files) (standard-input-port) (open-input-file (car files)))) (fs (if (null? files) files (cdr files)))) (letrec ((fun (lambda (accessor p?) (let loop ((r (accessor f))) (cond ((not (p? r)) r) ((null? fs) r) (else (close-input-port f) (set! f (open-input-file (car fs))) (set! fs (cdr fs)) (loop (accessor f))))))) (argf-getb (cut fun read-byte eof-object?)) (argf-getc (cut fun read-char eof-object?)) (argf-gets (lambda (n) (fun (cut read-block n <>) eof-object?))) (argf-close (lambda () (and (not (port-closed? f)) (close-input-port f)))) (argf-ready? (lambda (char-ready??) (fun (if char-ready?? char-ready? byte-ready?) (cut eq? #f <>))))) (make :getb argf-getb :getc argf-getc :gets argf-gets :close argf-close :ready argf-ready?)))) (provide "argf")