Макросы - Lisp (229184)
Формулировка задачи:
Разработать синтаксическию форму с помощью макроса:
(Если число (выражение при число> 0) (выражение при число=0) (выражение1) (выражение2) ... (выражениеN)).
Выражения1-N выполняются при число <0.
Решение задачи: «Макросы»
textual
Листинг программы
(defmacro если (num &rest args) (let ((a1 (car args)) (a2 (cadr args)) (ar (cddr args)) (!n (gensym 'n))) `(let ((,!n ,num)) (cond ((plusp ,!n) ,a1) ((zerop ,!n) ,a2) (t ,@ar)))))
Объяснение кода листинга программы
В данном коде определён макрос если, который выполняет условное выражение на основе переданного числа и списка аргументов. Код можно разбить на следующие части:
- (defmacro если (num &rest args) — определение макроса
еслис одним обязательным аргументомnumи произвольным числом дополнительных аргументовargs. - (let ((a1 (car args)) — в первой части тела макроса мы извлекаем первый элемент из списка аргументов и присваиваем его переменной
a1. - (let ((a2 (cadr args)) — во второй части тела макроса мы извлекаем второй элемент из списка аргументов и присваиваем его переменной
a2. - (let ((ar (cddr args)) — в третьей части тела макроса мы извлекаем остальной список аргументов (без первого и второго элементов) и присваиваем его переменной
ar. - (!n (gensym 'n)) — мы создаём уникальную переменную с помощью функции
gensym, которая будет использоваться в лямбда-выражении. - (let ((,!n ,num)) — мы создаём лямбда-выражение с переменной
!n, которая будет содержать значение аргументаnum. - (cond ((plusp ,!n) ,a1) — мы используем условную конструкцию
cond, чтобы проверить, является ли значение переменной!nположительным числом. Если это так, то возвращаем значениеa1. - ((zerop ,!n) ,a2) — мы проверяем, равно ли значение переменной
!nнулю. Если это так, то возвращаем значениеa2. - (t ,@ar)) — если ни одно из предыдущих условий не выполнено, то возвращаем список аргументов
ar. Таким образом, данный код определяет макросесли, который принимает число и список аргументов, и возвращает результат, основанный на условном выражении.