raku - 如何覆盖 NQPMatch.Str 函数
问题描述
...或者如何从匹配的文本$<sigil>.Str
中独立地更改值。是的,我在问如何欺骗上面的语法(即打电话给我)。token sigil { ... }
我正在尝试为没有 sigil 的 Raku 写一个俚语。
所以我想要nogil
令牌,匹配任何东西<?>
以返回字符串化的 NqpMatch:$<sigil>.Str
到'$'。
目前,我的令牌印记看起来像这样
token sigil {
| <[$@%&]>
| <nogil> { say "Nogil returned: ", lk($/, 'nogil').Str; # Here It should print "$"
}
}
token nogil-proxy {
| '€'
| <?>
{log "No sigil:", get-stack; }
}
并且该方法应该返回一个被覆盖的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);
目前,我的大部分测试都有效,但我在没有我的 (with no strict
)的情况下在声明中遇到问题,my-var = 42;
因为它们被视为方法调用。
@Arne-Sommer 已经发表了一篇文章和一篇文章。这是密切相关的。但这个问题的目的是:
我们如何自定义编译时令牌的返回值,而不是如何声明它。
解决方案
简介: @JonathanWorthington 指出的答案:
简介:使用mixin元函数。(而不是但需要的方法。)compose
演示:
- 通过检索另一个令牌创建一个 NQPMatch 对象:这里是
sigil-my
由 调用的令牌self.sigil-my
。 ^mixin
与角色一起使用
method sigil { return self.sigil-my.^mixin(Nogil::StrGil); }
上下文:完整的可重现代码:
sigil-my
所以你可以看到和是什么类型Nogil::StrGil
。但我告诉过你:令牌(不仅仅是方法)和角色(不可实例化的类)。
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 !
推荐阅读
- node.js - 将 nodejs typescript 项目构建到生产环境
- visual-studio-code - 有没有办法在 VS Code 中复制没有缩进的行?
- java - DuplicateMappingException 表[]包含多个逻辑列名引用的物理列名[]:[_id]、[Id]
- python-3.x - Jupyter 笔记本无法正常执行
- c++ - 多参数函数上的 std::bind 在函数模板中的编译时解析失败
- php - 我无法从 SQL 查询中读取数据?
- bash - 如何在 shellscript 的条件下测试动态子字符串变量?
- java - 创建排除引号内容的空格分隔列表
- java - 如何根据java 8中的某些条件迭代和过滤列表?
- c - 在变量初始化上强制转换指向 Matrix 的指针是引用或副本