此代码使用(实验性)宏:
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 宏是文本宏的一个例子)。一个 quasi
是一个引用结构,很像我们对字符串和正则表达式的引用,除了它引用 Perl 6 代码,将其表示为 AST-ish。 (我曾经说过它会产生 AST,但人们已经意识到,如果要在 quasi 内部插入一个中缀,那么它带有优先级和结合性,我们实际上无法为表达式直到插值之后。)
有一个“卫生”的宏概念,即在宏主体中声明的符号默认不应该泄漏到应用宏的地方,因为它们很可能只是实现细节。必须明确要求将符号放入应用宏的编译上下文中。所以我希望程序应该是这样的:
macro new-var() {
quasi {
my COMPILING::<$a> = 42
}
};
new-var;
say $a
请注意,这在今天的 Rakudo 中不起作用,尽管您可能会发现它可以在 007 中运行。
关于宏不允许定义词法变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53902367/