In Common Lisp, the reader is programmable. The reader is driven by
*readtable*. When reader finds a character from the readtable, it invokes the corresponding reader macro. Reader macro is a function that receives the input stream as an argument, can read more characters and returns a structure.
Here is an example of reader macro for quote (
(defun single-quote-reader (stream char) (declare (ignore char)) (list 'quote (read stream t nil t))) (set-macro-character #\' #'single-quote-reader)
And here is a reader macro for semicolon (comments):
(defun semicolon-reader (stream char) (declare (ignore char)) ;; First swallow the rest of the current input line. ;; End-of-file is acceptable for terminating the comment. (do () ((char= (read-char stream nil #\Newline t) #\Newline))) ;; Return zero values. (values)) (set-macro-character #\; #'semicolon-reader)
I believe that most of the Common Lisp syntax (besides symbols and numbers) is implemented as reader macros (see a list of reader macros in CLtL2 22.1.3. Macro Characters).