S-expressions are used for both code and data in Lisp. S-expressions were originally intended only as machine representations of human-readable M-expressions, but Lisp programmers soon started using S-expressions as the default notation.
S-expressions can either be single objects such as numbers, Lisp atoms including the special atoms nil and t, or cons pairs, written as (x . y). Longer lists are made up of nested cons pairs, for example
(1 . (2 . (3 . nil))) which can also be written as the easier to read and write (1 2 3).
Program code can be written in S-expressions, using prefix notation. An extra piece of syntactic sugar for writing Lisp programs is that the common expression (quote x) can be written with the abbreviation 'x.
Example:
(defun factorial (x)
(cond
((eq x 1) 1)
(t (* x (factorial (- x 1))))))
See also: car, cdr, cons