此代码使用(实验性)宏:
use experimental :macros;
macro new-var() {
quasi {
my $a = 42
}
};
new-var;
say $a
失败与Variable '$a' is not declared
,尽管宏通过时没有错误。如果这是一个正确的宏声明,它会做什么?如果不是,有没有办法在宏中定义新变量?
moritz 关于宏状态的答案是正确的,尽管根据我对 007 中所做工作的了解,我认为即使使用 Perl 6 宏的有效实现,编写的程序也不会是正确的。
Perl 6 宏本质上不是文本的(C 宏是文本宏的一个示例)。 Aquasi
是一个引号构造,很像我们对字符串和正则表达式的引号,除了它引用 Perl 6 代码,将其表示为 AST-ish 的东西。 (我曾经说过它会产生 AST,但人们已经意识到,如果要在准内部插入中缀,那么它就会具有优先级和结合性,而我们实际上无法为表达式直到插值之后。)
有一个“卫生”的宏观概念,默认情况下,在宏主体中声明的符号不应泄漏到应用宏的位置,因为它们很可能只是实现细节。人们必须明确要求将一个符号放入应用宏的编译上下文中。所以我希望该程序必须如下所示:
macro new-var() {
quasi {
my COMPILING::<$a> = 42
}
};
new-var;
say $a
请注意,这在今天的 Rakudo 中不起作用,尽管您可能会发现类似的东西可以在 007 中起作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)