Макросы не позволяют определять лексические переменные - PullRequest
0 голосов
/ 23 декабря 2018

Этот код, который использует (экспериментальные) макросы:

use experimental :macros; 
macro new-var() { 
  quasi { 
    my $a = 42
  }
};
new-var; 
say $a

Сбой с Variable '$a' is not declared, хотя макрос проходит без ошибки.Если это правильное объявление макроса, что оно делает?Если это не так, есть ли способ определить новые переменные из макроса?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Ответ от Морица правильный о состоянии макросов, хотя из того, что я знаю о работе, выполняемой в 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.

0 голосов
/ 23 декабря 2018

Возможно, это не тот ответ, который вы ищете, но макросы в Rakudo в настоящее время действительно повреждены.На данный момент я даже не могу вспомнить, должен ли он работать, или это ошибка в Rakudo - в большинстве случаев это не стоит того, чтобы это выяснять, потому что большинство макросов почти не работают.

Вот почему Карл Мясак создал 007 , чтобы поэкспериментировать с макрокомандой вне ядра Rakudo, чтобы в конечном итоге перенести извлеченные уроки в Rakudo и дизайн языка Perl 6.

...