Все макросы, доступные байтовому компилятору, раскрываются во время компиляции. «Достижимый» по сути означает не быть цитируемым.
Тело defun
s, defmacro
s, lambda
s, все байтово скомпилировано, когда исходный файл, который содержит их, байтово скомпилирован. Так что да, любой макрос внутри них будет расширен, если он не находится в кавычках ( '
). Очень распространенная ошибка - заключать lambda
s в кавычки, и, фактически, именно поэтому вы никогда неlambda
должны цитировать s .
Это одно из больших преимуществ макросов, поскольку они хорошо написаны и не влияют на производительность во время выполнения. Другое преимущество - это их сила и универсальность, конечно. Недостатком является то, что вы манипулируете синтаксисом, а не объектами, поэтому есть много места для проблем, некоторые неожиданные, другие неизбежные.