在编译时访问变量
Accessing a Variable at compile time
will
特性使编译时可以访问调用它的 Variable
。还有其他方法可以访问将安装在给定词法范围内的 Variable
s 吗? (我知道我可以在运行时访问 Scalar
s,但我正在尝试访问 Variable
s)。
特别是,我希望能够执行以下操作(不起作用):
multi trait_mod:<is>(Sub \fn, :$foo) {
for fn.lexical_variables { #`(do stuff) }
}
有什么办法吗?
目前没有,但在未来的 Raku 语言版本中应该可以。正在进行的工作是为 Raku 语言定义标准 AST(目前称为“RakuAST”),并重写编译器前端以根据它工作。完成后,它将暴露在许多地方。宏是最明显的消费者,但它也在计划中:
- 使块或例程的 AST 可从 traits 获得,以便 traits 可以检查甚至修改 AST
- 引入自定义编译器通道,这些模块将被授予访问它们所导入范围的整个 AST 的权限
其中第一个似乎可以满足您的用例。继续当前提议 API 它可能看起来像这样:
multi trait_mod:<is>(Sub $fn, :$foo!) {
for $fn.ast.ast-lexical-declarations {
say "Name: " ~ .lexical-name;
when RakuAST::VarDeclaration::Simple { #`( my $x / state $x / ... ) }
when RakuAST::VarDeclaration::Term { #`( my \x = ... ) }
# Others, depending if you care about parameters, placeholder params, implicits, etc.
}
}
will
特性使编译时可以访问调用它的 Variable
。还有其他方法可以访问将安装在给定词法范围内的 Variable
s 吗? (我知道我可以在运行时访问 Scalar
s,但我正在尝试访问 Variable
s)。
特别是,我希望能够执行以下操作(不起作用):
multi trait_mod:<is>(Sub \fn, :$foo) {
for fn.lexical_variables { #`(do stuff) }
}
有什么办法吗?
目前没有,但在未来的 Raku 语言版本中应该可以。正在进行的工作是为 Raku 语言定义标准 AST(目前称为“RakuAST”),并重写编译器前端以根据它工作。完成后,它将暴露在许多地方。宏是最明显的消费者,但它也在计划中:
- 使块或例程的 AST 可从 traits 获得,以便 traits 可以检查甚至修改 AST
- 引入自定义编译器通道,这些模块将被授予访问它们所导入范围的整个 AST 的权限
其中第一个似乎可以满足您的用例。继续当前提议 API 它可能看起来像这样:
multi trait_mod:<is>(Sub $fn, :$foo!) {
for $fn.ast.ast-lexical-declarations {
say "Name: " ~ .lexical-name;
when RakuAST::VarDeclaration::Simple { #`( my $x / state $x / ... ) }
when RakuAST::VarDeclaration::Term { #`( my \x = ... ) }
# Others, depending if you care about parameters, placeholder params, implicits, etc.
}
}