宏不允许定义词法变量

标签 macros raku

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

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/

相关文章:

c++ - Visual Studio : Macro for checking configuration type (exe/dll)

macros - 如何在宏中允许可选的尾随逗号?

c - __typeof__ 宏扩展为函数名

raku - Perl 6 的 eof 是否放弃得太快了?

raku - 馈送运算符(operator)管道的行为

scala - 测试隐式是否存在

regex - 如何将此 Perl5/PCRE 转换为 Perl 6 正则表达式?

raku - 如何将数组插入到数组数组中?

raku - 使用多个源文件包装一个方法

rust - 为什么我不能通过 `std::assert` 导入 `use` 而它适用于来自 std 的其他宏?