导出动态范围的变量?

Vad*_*man 6 perl6

基本上,问题更多的是关于语法,但我认为它可能更像是一个关于动态变量的有趣练习.

我有一个带有原型令牌的语法角色(示例被简化以演示这个想法):

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)

在声明角色的模块范围内可以工作.但显然它没有.所以,问题是:这有什么优雅的解决方案吗?

其实,我也希望该解决方案将允许移动的声明$*delimiterfoo的标记定义之外了.

作为旁注:我的第一个想法是关于向令牌添加参数.但是每个变体的签名完全相同也很糟糕:

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一个级别.

use*_*601 1

根据我在一个模块中完成的一些测试工作,允许对模块进行范围设置,您可以执行此操作,但需要使用 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\n
Run Code Online (Sandbox Code Playgroud)\n