我想在我的自定义俚语中重用token parameterfrom Perl6::Grammar来添加一个“custom-param”参数,而无需 cargo culting。
我的意思是:
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
token parameter { # the new one
"custom-param" || < here the token stolen from $main-grammar.^find_method('parameter'); >
}
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
my $actions = $main-actions.^mixin(Nogil::NogilActions);
$*LANG.define_slang('MAIN', $grammar, $actions);
Run Code Online (Sandbox Code Playgroud)
不确定是否清楚:这就像在角色的令牌中调用父令牌一样。我知道这个角色会覆盖它,所以我在$grammar.
已经测试:
P6opaque: no such attribute '$!pos' on type NQPMatch in a Scalar when trying to get a value
Run Code Online (Sandbox Code Playgroud)
Attempt to return outside of immediately-enclosing Routine (i.e. `return` execution is outside the dynamic scope of the Routine where `return` was used)
Run Code Online (Sandbox Code Playgroud)
介绍:在多次使用 nqp 出现类似错误后,我发现:
简介: nqp +Scalar在错误消息中 -> 替换=为:=
解释:在标量中 使用绑定运算符:=而不是赋值= which autobox 因此标量的错误消息。
演示:一个完整的示例(在 BEGIN phaser 中使用)。尝试“我的”€印记和“他们的”(用语言编译),以防我的失败。
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
method sigil {
# Bind
my $sigil-they := $main-grammar.^find_method('sigil');
my $sigil-me := self.sigil-eu;
# Check My
return $sigil-me if $sigil-me;
# Return Their
return $sigil-they(self);
}
token sigil-eu { '€' }
}
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
$*LANG.define_slang('MAIN', $grammar, $main-actions);
Run Code Online (Sandbox Code Playgroud)
注1:我删除say了演示的一些必需品。只需添加.Str到那些公开的对象(NQPMatches)。
注2:如果要创建临时变量(如$res),请保持绑定(:=)。
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |