Aside from some already mentioned reasons, one can always do (defun listen (&optional (input-stream *standard-input*)) (let ((char (read-char-no-hang stream nil nil))) (cond ((null char) nil) (t (unread-char char) t)))) instead of the other way around, without changing the definition of anything.