Хорошо, давайте начнем с самого начала.
Макрос используется для создания новых форм, которые обычно зависят от ввода макроса. Прежде чем код будет выполнен или оценен, макрос должен быть расширен. Расширение макроса — это процесс, который происходит перед оценкой формы, в которой он используется. Результатом такого расширения обычно является форма шепелявости.
Итак, внутри макроса есть несколько уровней кода.
- Код без кавычек будет оцениваться во время макрорасширения (не во время выполнения!), в вашем примере вы определяете функцию
f
при раскрытии макроса (для чего?);
- Далее здесь цитируется (с обычными кавычками или обратными кавычками или даже вложенными обратными кавычками) код, который станет частью результата макрорасширения (в буквальном виде); вы можете контролировать, какая часть кода будет оцениваться во время макрорасширения, а какая останется неизменной (в кавычках, частично или полностью). Это позволяет создать что-либо до того, как оно будет выполнено.
Еще одна особенность макроса заключается в том, что он не оценивает свои параметры перед раскрытием, в отличие от функции. Чтобы дать вам представление о том, что такое макрос, посмотрите это (первое, что пришло в голову):
(defmacro aif (test then &optional else)
`(let ((it ,test))
(if it ,then ,else)))
Вы можете использовать его следующим образом:
CL-USER> (defparameter *x* '((a . 1) (b . 2) (c . 3) (d . 4)))
*X*
CL-USER> (aif (find 'c *x* :key #'car) (1+ (cdr it)) 0)
4
Этот макрос создает полезную лексическую привязку, захватывая переменную it
. После проверки условия не нужно пересчитывать результат, он доступен в формах «тогда» и «иначе». Это невозможно сделать только с помощью функции, она ввела в язык новую конструкцию управления. Но макрос — это не только создание лексического окружения.
Макрос — мощный инструмент. Невозможно полностью описать, что вы можете с ним делать, потому что вы можете делать все. Но nth
— это не то, для чего вам нужен макрос. Чтобы создать клон nth
, вы можете попробовать написать рекурсивную функцию.
Важно отметить, что макрос LISP — самая мощная вещь в мире программирования, а LISP — единственный язык, обладающий такой мощью ;-)
Чтобы вдохновить вас, я бы порекомендовал эту статью: http://www.paulgraham.com/avg.html а>
Чтобы освоить макрос, начните примерно так:
http://www.gigamonkeys.com/book/macros-defining-your-own.html
Затем может быть "On Lisp" Пола Грэма, затем "Let Over Lambda".
person
Mark Karpov
schedule
04.06.2014