(define ((make-port-for-each read-function) function port) (do ((thing (read-function port) (read-function port))) ((eof-object? thing)) (function thing))) (define ((make-current-port-for-each read-function) function) (do ((thing (read-function) (read-function))) ((eof-object? thing)) (function thing))) (define ((make-line-by-line-transform function)) ((make-current-port-for-each read-line) (lambda (string) (display (function string)) (newline)))) (define ((make-rederected-transform transform) in-filename out-filename) (with-output-to-file out-filename (lambda () (with-input-from-file in-filename transform)))) (define downcase-transform (make-line-by-line-transform string-downcase!)) (define file-downcase (make-rederected-transform downcase-transform)) (define identity-transform (make-line-by-line-transform identity)) (define copy-file (make-rederected-transform identity-transform)) (define (display-file file-name) (with-input-from-file file-name identity-transform)) (define ((make-file-transform-by-lines! function) filename) (define list '()) (with-input-from-file filename (lambda () (set! list ((make-collect-cons (make-port-for-each read-line)) function (current-input-port))))) (with-output-to-file filename (lambda () (for-each (lambda (x) (display x) (newline)) list)))) (define file-downcase! (make-file-transform-by-lines! string-downcase!))