Відповіді:
Усі макроси, доступні компілятором байтів, розгортаються під час компіляції. "Доступний" по суті означає, що його не котирують.
Тіло defun
s, defmacro
s, lambda
s - всі байтові компільовані, коли вихідний файл, який їх містить, компілюється в байті. Так, так, будь-який макрос всередині них буде розширений, якщо вони не знаходяться всередині цитати ( '
). Дуже поширеною помилкою є загортання lambda
s у цитату, і насправді саме тому ви ніколи неlambda
повинні цитувати своїх s .
Це одна з головних переваг макросів, якщо вони добре написані, вони не впливають на продуктивність виконання. Інша перевага - це, звичайно, їх потужність і універсальність. Недоліком є те, що ви маніпулюєте синтаксисом, а не предметами, тому є багато місця для проблем, деякі несподівані, інші неминучі.
Як уже пояснила Малабарба, макроси розгортаються під час збирання байтів. Якщо файл не компілюється, макроси розгортаються при завантаженні файлу (охоче розширення макросу).
Але не покладайтеся на це. Це дуже поганий стиль. Як правило, ви не можете очікувати, що код, який використовує ваш макрос, насправді компілюється, і вам слід, як правило, запустити якомога менше коду під час компіляції. Зокрема, використовуйте макроси мало, і лише якщо іншого способу немає. Як правило, використовуйте макроси лише для синтаксису та ніколи для семантики (або функціональності).
Макроси - це герметична абстракція. Їх розширення жорстко закодирується в цільовий код під час компіляції і не може бути змінено заднім числом. Цільовий код згодом залежить від конкретної реалізації макросу під час розширення. Конкретно, це залежить від усіх внутрішніх API, що використовуються в тілі макросів.
Отже, ви не можете змінити будь-який з цього API чи будь-що, на що покладається розширення макросу, не порушуючи жодного коду, який був складений проти вашого макросу.
Ліберальне використання макросів для функціональності прокладає шлях до пекла залежності .