When `read` is called with a function as stream argument, the return values of that function are often interpreted as Latin-1 characters with only the 8 low bits used. Example: (let* ((next '(?A #x12a nil)) (f (lambda (&rest args) (if args (push (car args) next) (pop next))))) (read f)) => A* ; expected: AĪ This is a result of `readchar` setting *multibyte to 0 on this code path. The reader is not very consistent: inside string and character literals, the code seems to work as expected. The fix is straightforward (attached).