gpt4 book ai didi

宏不允许定义词法变量

转载 作者:行者123 更新时间:2023-12-04 10:06:36 25 4
gpt4 key购买 nike

此代码使用(实验性)宏:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com