基本上,问题更多的是关于语法,但我认为它可能更像是一个关于动态变量的有趣练习.
我有一个带有原型令牌的语法角色(示例被简化以演示这个想法):
proto token foo {*}
token foo:sym<a> {
:my $*delimiter = q<">;
\" ~ \" <value>
}
token foo:sym<b> {
:my $*delimiter = q<'>;
\' ~ \' <value>
}
token value {
.+? <?before $($*delimeter) || $($*custom-delimiter)>
}
Run Code Online (Sandbox Code Playgroud)
当角色被语法消耗时,我希望$*custom-delimiter通过语法来设置.当然,我可以在任何<foo>需要的地方宣布它.但有时可以通过通用默认值进行预初始化.就像是:
{ $*custom-delimiter //= $default-delimiter }
Run Code Online (Sandbox Code Playgroud)
在value令牌中会起作用.但仍需要外部预先申报.
我希望:
our $*custom-delimiter is export = $default-delimiter;
Run Code Online (Sandbox Code Playgroud)
在声明角色的模块范围内可以工作.但显然它没有.所以,问题是:这有什么优雅的解决方案吗?
其实,我也希望该解决方案将允许移动的声明$*delimiter中foo的标记定义之外了.
作为旁注:我的第一个想法是关于向令牌添加参数.但是每个变体的签名完全相同也很糟糕:
token foo:sym<a> ( $*custom-delimiter = $default-delimiter ) {
}
token foo:sym<b> ( $*custom-delimiter = $default-delimiter ) {
}
token foo:sym<c> ( $*custom-delimiter = $default-delimiter ) {
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是:
token pre-foo ( $*custom-delimiter = $default-delimiter ) {
<foo>
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,动作类中需要一个额外的方法来传播$/<foo>.ast一个级别.
根据我在一个模块中完成的一些测试工作,允许对模块进行范围设置,您可以执行此操作,但需要使用 EXPORT 子项。
\n我想原因是,在执行 EXPORT 时,我们可以明确安装一个全新的动态变量,而不是链接到现有动态变量 \xe2\x80\x94\xc2\xa0 的新符号,后者对我来说使范围界定很不清楚。
\n这似乎对我来说没问题。
\n# filename: Foo.rakumod\n# no 'unit module', etc\n\nsub EXPORT {\n proto token foo {*}\n token foo:a {\xc2\xa0\xe2\x80\xa6\xc2\xa0}\n token foo:b {\xc2\xa0\xe2\x80\xa6\xc2\xa0}\n\n Map.new: \n '&foo' => &foo,\n '$*dynamic' => my $ = 'default'\n}\n\nRun Code Online (Sandbox Code Playgroud)\n