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.