2012-07-03 2 views
5

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

add(1, add(2, 3)) 

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

+1

Мне не удалось получить достаточную информацию из скимминга, чтобы ответить на ваш вопрос, но вам может быть интересен этот документ, описывающий макросистему Racket: [Макросы, которые работают вместе: привязки времени компиляции, частичное расширение и контексты определения] (http://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf) –

+0

Я плохо знаю эту конкретную бумагу, я прочитал только версию конференции, но макросистема Scala не совсем сопоставимо - скажем, проверка типов происходит до макрорасширения, хотя это требует разрешения имен и позволяет добавлять * гигиенику * с помощью reify. Не пугайтесь: макросы Scala по умолчанию не являются гигиеничными, но отдельные макросы - это если вы только создаете АСТ для возврата через reify (что несколько похоже на квазицитирование, я все равно не понимаю разницы). – Blaisorblade

ответ

8

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

+0

Я думаю, что другая часть ответа (надеюсь), что после расширения внутреннего макроса, результат проверяется typecheck перед вызовом внешнего макроса (в противном случае вывод может быть не полностью напечатан/разрешен). – Blaisorblade

+1

Действительно, расширение внутренних макросов проверяется typecheck перед передачей внешнего макроса. Расширения макросов всегда проверяются на типе сразу после их возврата из макрореализации. –

Смежные вопросы