Насколько безопасно вкладывать вызовы макросов?

Я тестировал несколько вызовов вложенных макросов, и они работали, как ожидалось (... как я и ожидал!). Например, предположил фиктивный макрос add и следующее выражение:

add(1, add(2, 3))

Во-первых, внутреннее добавление расширяется (2 + 3), а во-вторых, внешнее выполняет свою часть (1 + (2 + 3)). Я видел, что внешний макрос не получает шума от внутреннего вызова - во входном выражении - поэтому внутреннее расширение кажется ему полностью прозрачным. Всегда ли это справедливо (даже с более сложными макросами и типами)? Это безопасно?


person jeslg    schedule 03.07.2012    source источник
comment
Мне не удалось собрать достаточно информации из беглого просмотра, чтобы адекватно ответить на ваш вопрос, но вас может заинтересовать этот документ, описывающий систему макросов Racket: Макросы, которые работают вместе: привязки времени компиляции, частичное расширение и контексты определения   -  person Dan Burton    schedule 03.07.2012
comment
Я плохо знаю эту конкретную статью, я читал только версию для конференции, но макросистема Scala не совсем сопоставима - скажем, проверка типов выполняется до расширения макроса - хотя это требуется для разрешения имен и обеспечения гигиены добавлено с помощью reify. Не пугайтесь: макросы Scala не являются гигиеничными по умолчанию, но отдельные макросы - это если вы создаете AST только для возврата через reify (что в чем-то похоже на квази-цитату, я до сих пор не понимаю разницы).   -  person Blaisorblade    schedule 27.07.2012


Ответы (1)


Внутренние макросы всегда раскрываются первыми (даже если они указаны как аргументы по имени).

person Eugene Burmako    schedule 03.07.2012
comment
Я думаю, что другая часть ответа (надеюсь) заключается в том, что после расширения внутреннего макроса результат проверяется по типу перед вызовом внешнего макроса (в противном случае вывод может быть не полностью типизирован / разрешен). - person Blaisorblade; 27.07.2012
comment
Действительно, при раскрытии внутреннего макроса он проверяется по типу перед передачей во внешний макрос. Типы расширений макросов всегда проверяются сразу после их возврата из реализаций макросов. - person Eugene Burmako; 27.07.2012