Предположим, мы хотим определить конструкцию Lisp для увеличения
значения переменной, подобно оператору ++ в C. Мы
хотим написать (inc x) и добиться эффекта
(setq x (1+ x)). Вот определение макроса, которое
выполняет эту задачу:
(defmacro inc (var) (list 'setq var (list '1+ var)))
Когда это вызывается с (inc x), аргумент var — это
символ x, а не значение x, как это было бы
в функции. Тело макроса использует это для построения развертывания, которое
составляет (setq x (1+ x)). Как только определение макроса
возвращает это развертывание, Lisp продолжает его вычислять, тем самым
увеличивая x.
Этот предикат проверяет, является ли его аргумент макросом, и возвращает
t, если да, и nil в противном случае.