It occurs to me that you could replace the read with read-string or read-char when the argument string-length is 1 -- reading ahead -- then in the read-string case, after getting whatever you want, put the port-position to start reading the rest. Kind of messy perhaps, and I haven't tried this.