(let ((*read-intern* (lambda (x) (let* ((result nil) (s (string x)) (end-char (char s (1- (length s))))) (when (equalp end-char #\i) (let ((ss (ppcre:split "[-+]" (subseq s 0 (1- (length s))))) real imag) (when (and ss (= (length ss) 2) (setf real (parse-integer (first ss))) (setf imag (parse-integer (second ss)))) (setf result (complex real imag))))) (or result (intern x)))))) (read-from-string "0+1i"))