14.1 Простой пример макроса

Предположим, мы хотим определить конструкцию 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.

Функция: macrop object

Этот предикат проверяет, является ли его аргумент макросом, и возвращает t, если да, и nil в противном случае.