Suppose you have a parser that reads from a stream, but the stream is missing something. E.g. you have a function that reads a string from a stream, but while the function expects the next character to be a opening quote, the opening quote has already been read from the stream.
The obvious solution is
unread-char. This takes a character — the last character read from the stream — and puts it back into the stream. And this is fine for the situation where your function is being invoked as (say) a reader macro. But what if you need to call the parser by itself?
What you need in this situation is not
unread-char but a concatenated stream. The stream returned by
make-concatenated-stream returns all the elements from all of its arguments as as a single stream. You can add any prefix or suffix you need:
(defun read-delimited-string (stream) (let ((stream (make-concatenated-stream (make-string-input-stream "\"") stream))) (parse-string stream)))