Что делает этот макрос? - Lisp
Формулировка задачи:
Определить, что делает следующий макрос. В случае возникновения
ошибки объяснить причину ее появления.
>(defmacro бот (&whole форма &rest args) форма)
Решение задачи: «Что делает этот макрос?»
textual
Листинг программы
(defun add (a b) (+ a b)) (define-compiler-macro add (&whole whole a b) (if (every #'constantp (list a b)) (+ a b) whole)) (swank:swank-compiler-macroexpand "(add 1 2)") ;; "3" (swank:swank-compiler-macroexpand "(add a b)") ;; "(ADD A B)"
Объяснение кода листинга программы
В данном коде определен макрос ADD, который складывает два числа.
(defun add (a b) (+ a b))- определение функции ADD для сложения двух чисел.(define-compiler-macro add (&whole whole a b) (if (every #'constantp (list a b)) (+ a b) whole))- определение макроса ADD для сложения двух чисел с помощьюevery #'constantp (list a b). Если оба аргумента являются константами, то возвращается их сумма, иначе возвращается исходный код.(swank:swank-compiler-macroexpand(add 1 2))- выполнение макроса ADD с аргументами 1 и 2, результат(+ 1 2)или3.(swank:swank-compiler-macroexpand(add a b))- выполнение макроса ADD с аргументамиaиb, результат(ADD A B)- исходный код макроса ADD.