如何覆盖 NQPMatch.Str 函数
How to override the NQPMatch.Str function
... 或者如何从 token sigil { ... }
独立于匹配的文本 更改 $<sigil>.Str
值。是的,我在问如何 欺骗 上面的语法(即调用)我。
我正在尝试写一个Slang for Raku without sigil。
所以我想要 nogil
令牌,匹配任何 <?>
到 return 字符串化的 NqpMatch:$<sigil>.Str
到 '$'。
目前,我的令牌纹章看起来像那样
token sigil {
| <[$@%&]>
| <nogil> { say "Nogil returned: ", lk($/, 'nogil').Str; # Here It should print "$"
}
}
token nogil-proxy {
| '€'
| <?>
{log "No sigil:", get-stack; }
}
并且使用那个的方法应该 return 一个 NQPMatch
方法 Str
被覆盖
method nogil {
my $cursor := self.nogil-proxy;
# .. This si where Nqp expertise would be nice
say "string is:", $cursor.Str; # here also it should print "$"
return $cursor;
}
尝试失败:
$cursor.^cache_add('Str', sub { return '$'; } );
$cursor.^publish_method_cache;
for $cursor.^attributes { .name.say };
for $cursor.^methods { .name.say };
say $cursor.WHAT.Str;
nqp::setmethcacheauth($cursor, 0);
目前,我的大部分测试都有效,但我在没有我的(使用 no strict
)的声明中遇到问题,例如 my-var = 42;
,因为它们被视为方法调用。
@Arne-Sommer 已经做了 post and an article。这是密切相关的。但是这个问题的目的是:
我们如何自定义编译时令牌的 return 值 而不是如何声明它。
简介: @JonathanWorthington 指出的答案:
简介: 使用 mixin meta function. (And NOT the but 需要 compose
方法。)
演示:
- 通过检索另一个 token 创建一个 NQPMatch 对象:这里是
self.sigil-my
调用的令牌 sigil-my
。
- 使用
^mixin
和一个角色
method sigil { return self.sigil-my.^mixin(Nogil::StrGil); }
上下文: 完整的可重现代码:
所以你可以看到sigil-my
和Nogil::StrGil
是什么类型。但是我告诉你:token(不止方法)和角色(无法实例化类)。
role Nogil::StrGil {
method Str() {
return sigilize(callsame);
}
}
sub EXPORT(|) {
# Save: main raku grammar
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
method sigil {
return self.sigil-my.^mixin(Nogil::StrGil);
}
}
token sigil-my { | <[$@%&]> | <?> }
# Mix
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
my $actions = $main-actions.^mixin(Nogil::NogilActions);
$*LANG.define_slang('MAIN', $grammar, $actions);
# Return empty hash -> specify that we’re not exporting anything extra
return {};
}
注意:这打开了解决更多问题的大门(也由 jnthn 问题评论指出)-> -0fun !
... 或者如何从 token sigil { ... }
独立于匹配的文本 更改 $<sigil>.Str
值。是的,我在问如何 欺骗 上面的语法(即调用)我。
我正在尝试写一个Slang for Raku without sigil。
所以我想要 nogil
令牌,匹配任何 <?>
到 return 字符串化的 NqpMatch:$<sigil>.Str
到 '$'。
目前,我的令牌纹章看起来像那样
token sigil {
| <[$@%&]>
| <nogil> { say "Nogil returned: ", lk($/, 'nogil').Str; # Here It should print "$"
}
}
token nogil-proxy {
| '€'
| <?>
{log "No sigil:", get-stack; }
}
并且使用那个的方法应该 return 一个 NQPMatch
方法 Str
被覆盖
method nogil {
my $cursor := self.nogil-proxy;
# .. This si where Nqp expertise would be nice
say "string is:", $cursor.Str; # here also it should print "$"
return $cursor;
}
尝试失败:
$cursor.^cache_add('Str', sub { return '$'; } );
$cursor.^publish_method_cache;
for $cursor.^attributes { .name.say };
for $cursor.^methods { .name.say };
say $cursor.WHAT.Str;
nqp::setmethcacheauth($cursor, 0);
目前,我的大部分测试都有效,但我在没有我的(使用 no strict
)的声明中遇到问题,例如 my-var = 42;
,因为它们被视为方法调用。
@Arne-Sommer 已经做了 post and an article。这是密切相关的。但是这个问题的目的是:
我们如何自定义编译时令牌的 return 值 而不是如何声明它。
简介: @JonathanWorthington 指出的答案:
简介: 使用 mixin meta function. (And NOT the but 需要 compose
方法。)
演示:
- 通过检索另一个 token 创建一个 NQPMatch 对象:这里是
self.sigil-my
调用的令牌sigil-my
。 - 使用
^mixin
和一个角色
method sigil { return self.sigil-my.^mixin(Nogil::StrGil); }
上下文: 完整的可重现代码:
所以你可以看到sigil-my
和Nogil::StrGil
是什么类型。但是我告诉你:token(不止方法)和角色(无法实例化类)。
role Nogil::StrGil {
method Str() {
return sigilize(callsame);
}
}
sub EXPORT(|) {
# Save: main raku grammar
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
method sigil {
return self.sigil-my.^mixin(Nogil::StrGil);
}
}
token sigil-my { | <[$@%&]> | <?> }
# Mix
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
my $actions = $main-actions.^mixin(Nogil::NogilActions);
$*LANG.define_slang('MAIN', $grammar, $actions);
# Return empty hash -> specify that we’re not exporting anything extra
return {};
}
注意:这打开了解决更多问题的大门(也由 jnthn 问题评论指出)-> -0fun !