Я тестировал несколько вложенных вызовов макросов, и они работали, как и ожидалось, например, предположим, вымышленной добавить макросъемки и следующее выражение (... как и следовало ожидать от меня!):Безопасно ли устанавливать макросы?
add(1, add(2, 3))
Во-первых, внутреннее добавление расширяется (2 + 3), а во-вторых, верхняя часть выполняет свою часть (1 + (2 + 3)). Я видел, что макрос outter не получает никакого шума от внутреннего вызова - во входном выражении, поэтому внутреннее расширение кажется полностью прозрачным для него. Сохраняется ли этот факт (даже с более сложными макросами и типами)? Безопасно ли это?
Мне не удалось получить достаточную информацию из скимминга, чтобы ответить на ваш вопрос, но вам может быть интересен этот документ, описывающий макросистему Racket: [Макросы, которые работают вместе: привязки времени компиляции, частичное расширение и контексты определения] (http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf) –
Я плохо знаю эту конкретную бумагу, я прочитал только версию конференции, но макросистема Scala не совсем сопоставимо - скажем, проверка типов происходит до макрорасширения, хотя это требует разрешения имен и позволяет добавлять * гигиенику * с помощью reify. Не пугайтесь: макросы Scala по умолчанию не являются гигиеничными, но отдельные макросы - это если вы только создаете АСТ для возврата через reify (что несколько похоже на квазицитирование, я все равно не понимаю разницы). – Blaisorblade