此代码使用(实验)宏:
use experimental :macros;
macro new-var() {
quasi {
my $a = 42
}
};
new-var;
say $a
Run Code Online (Sandbox Code Playgroud)
失败Variable '$a' is not declared,虽然宏没有错误通过.如果这是一个正确的宏声明,它会做什么?如果不是,有没有办法从宏中定义新变量?
moritz的答案对于宏的状态是正确的,尽管根据我对007中所做工作的了解,我认为即使使用Perl 6宏的工作实现,编写的程序也是正确的.
Perl 6宏本质上不是文本的(C宏是文本的宏).A quasi是一个引用构造,就像我们有字符串和正则表达式的引号一样,除了引用Perl 6代码,将其表示为AST-ish.(我曾经说它会产生AST,但是我们已经意识到,如果一个中缀是在一个准内部内插的,那么它会带来一个优先级和相关性,而我们实际上无法形成正确的树.表达直到插值后.)
有一个"卫生"的宏观概念,默认情况下,宏体中声明的符号不应泄漏到应用宏的位置,因为它们可能只是实现细节.人们必须明确要求将符号放入应用宏的编译上下文中.所以我希望程序看起来像这样:
macro new-var() {
quasi {
my COMPILING::<$a> = 42
}
};
new-var;
say $a
Run Code Online (Sandbox Code Playgroud)
请注意,这在今天的Rakudo中不起作用,尽管您可能会发现它可以在007中使用.
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |