From: Adam W. <li...@co...> - 2004-01-15 04:35:24
|
> But after the next character has been read it's no longer possible to > replace the . before calling read. Which means (a wrapper for) read now > has to be implemented as well. Bless the specification writers and Common Lisp implementors. I asked myself, "Wouldn't it be great if I could reconstruct the start of the stream and join it to the existing stream so that I could pass a newly constructed stream to read." After consulting the Hyperspec it turns out I had described CONCATENATED input streams! You just construct another stream which access the first stream and seamlessly switches to the second stream after the first stream runs out. The essence of the fix is a rewrite of READ-MAYBE-NOTHING to support an additional prependchar argument (nil for no character to prepend or a character that is prepended to the stream): (cond (prependchar (list (read (make-concatenated-stream (make-string-input-stream (string prependchar)) stream) t))) (t (case peekedchar (#\; (read-comment stream nil) nil) (otherwise (list (read stream t)))))) Regards, Adam |