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.