string output streams
get-output-stream-string doesn’t just return the string accumulated so far in a string-stream. It also resets the accumulation, so you can use the same stream multiple times for separate results. Here’s a simple string splitter:
(defun split (string &optional (split-character #\Space))
(let ((result '())
(stream (make-string-output-stream)))
(loop for char across string
if (char= char split-character)
do (push (get-output-stream-string stream) result)
else
do (write-char char stream))
(push (get-output-stream-string stream) result)
(nreverse result)))
It could be used like this:
* (split "The quick brown fox.")
("The" "quick" "brown" "fox.")
I learned about this technique from an Erik Naggum post.