Ответ от Морица правильный о состоянии макросов, хотя из того, что я знаю о работе, выполняемой в 007 году, я не думаю, что написанная программа будет правильной даже при работающей реализации макросов Perl 6.
Макросы Perl 6 не будут текстовыми по своей природе (макросы C являются примером текстовых).A quasi
является конструкцией кавычек, так же, как у нас есть кавычки для строк и регулярных выражений, за исключением того, что он цитирует код Perl 6, представляя его как нечто AST-иш.(Я однажды сказал бы, что он производит AST, но было понято, что если инфикс должен быть интерполирован внутри квази, то он имеет приоритет и ассоциативность, и мы не можем фактически сформировать правильное дерево длявыражение до интерполяции.)
Существует концепция макроса "гигиена", согласно которой символы, объявленные в теле макроса, по умолчанию не должны просачиваться в место, где применяется макрос, поскольку они могутбыть детали реализации.Можно было бы явно попросить поместить символ в контекст компиляции, где применяется макрос.Поэтому я ожидаю, что программа должна выглядеть следующим образом:
macro new-var() {
quasi {
my COMPILING::<$a> = 42
}
};
new-var;
say $a
Обратите внимание, что сегодня это не сработает в Rakudo, хотя вы можете найти что-то похожее на то, что можно сделать в 007.