(module fs mzscheme (provide (all-defined)) #|"fs.ss -- File utilities, esp for string->symbol conversion and storage"|# (define (read-lines f) (let readloop ((line (read-line f)) (acc ())) (if (eof-object? line) (reverse! acc) (readloop (read-line f) (cons line acc))))) (define (dump fname . data) "dump all data to a file" (when (file-exists? fname) (delete-file fname)) (call-with-output-file fname (lambda (f) (for-each (lambda (datum) (write datum f)) data)))) (define (slurp fname) "slurp all data objects from a file, Common Lisp style Single objects are returned as-is; multiple objects are returned in a list" (call-with-input-file fname (lambda (f) (let ((data ())) (do ((datum (read f) (read f))) ;need better iterator here ((eof-object? datum) (reverse data)) (set! data (cons datum data))) (if (= 1 (length data)) (car data) (reverse data)))))) (define (read-file fname) "Just like slurp, but only reads one datum. So get it right." (call-with-input-file fname (lambda (f) (read f)))) (define (process-file inf outf f) (call-with-output-file outf (lambda (o) (call-with-input-file inf (lambda (i) (write o (f (read i)))))))) (define (process-file-vars inf outf f) (call-with-output-file outf (lambda (o) (call-with-input-file inf (lambda (i) (do ((datum (read i) (read i))) ((eof-object? datum) (void)) (write o (f datum)))))))) (define (process-file-lines inf outf f) (call-with-output-file outf (lambda (o) (call-with-input-file inf (lambda (i) (do ((line (read-line i) (read-line i))) ((eof-object? line) (void)) (write o (f line)))))))) )