Most of the time, you use functions. Sometimes, you need to define "WITH-X" macros or "DO-Y" iterators, or a custom "DEFINE-Z" to shorten declarations (I tend to use macrolet for that).
(defun rgb (r g b) (format nil "#~@{~2,'0x~}" r g b))
(defparameter *background* (rgb 10 10 30))
(defparameter *foreground* (rgb 90 90 255))
(with-html-output-to-string (s)
(:html
(:head
(:title "Hello")
(:style :media "screen"
:type "text/css"
(str (cl-css:css
`((:body :background-color ,*background*
:color ,*foreground*)))))
(:script :type "text/javascript"
(str
(ps:ps
(setf (ps:@ window onload)
(lambda () (alert "Message")))))))
(:body
(:h1 "Heading"))))
The above is an example of what I consider a heavy usage of macros, and yet somehow I find it readable.(the output is here: http://pastebin.com/raw/S5cb5ufC)