[plt-scheme] reading a whole file
On Nov 10, Shriram Krishnamurthi wrote:
> Fast on the heels of this thread, today I had to insert a bunch of
> JavaScript gobbledygook into each of my HTML files. Here's the Scheme
> code I wrote:
>
> ----------
> (define tracker "... gobbledygook goes here ...
> ")
>
> (define (go f)
> (let ([txt (with-input-from-file f
> (lambda () (read-string (file-size f))))])
> (let ([new-txt
> (regexp-replace (regexp "</HEAD>")
> txt
> (string-append tracker "</HEAD>"))])
> (if (string=? txt new-txt)
> (printf "Pattern not found in ~a~n" f)
> (with-output-to-file "out"
> (lambda () (write-string new-txt)))))))
>
> (go (vector-ref (current-command-line-arguments) 0))
> ----------
>
> [Orthogonal note: writing the gobbledygook was itself a bit painful,
> and made me better appreciate Python's quoting.]
You mean arbitrary text? Like
#<<EOT
some text here
EOT
Or even better:
(define foo "FOO")
#reader scribble/reader
@string-append{
blah blah
@foo
}
And before you say how much more verbose this is, you can just put the
#reader line before the #lang line and then you just use the @ syntax
anywhere in the module. (Perhaps it makes sense to add it to
scheme/base at some point in the future...)
> It sure would have been nice to make the above code both shorter and
> more robust with FILE->STRING and STRING->FILE...
The only question is how many functions to have in that interface.
Currently, I see 16 of them:
file->string
file->strings ; list of strings, read with read-line
file->bytes
file->bytess ; bad name, and perhaps not needed anyway
port->... ; port versions of all of the above
string->file ; reverse direction
I hope that there's some way to cut all that down somehow... (The
file/port cannot be done based on the input value if the two functions
come from scheme/port and scheme/file, some keyword argument that
makes it return bytes/string, or a list of lines seems ugly.)
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!