Raku中自定义Ƥ运算符访问调用帧$_变量遇阻,求可行方案
在Raku中实现
Ƥ<key>替代$_<key>的方案 需求说明
你希望当$_是Associative类型时,用Ƥ<something>替代$_<something>,同时自动完成键的存在性检查,不存在对应键时返回空字符串。
问题根源
你之前通过callframe(1).my<$_>获取调用上下文的$_失败,是因为$_作为块内的词法主题变量,可能被编译器优化为Rakudo::Internals::LoweredAwayLexical,无法通过callframe直接访问。
可行实现方案
方案一:使用宏(推荐)
宏在编译时展开代码,直接将Ƥ<key>替换为对应的检查逻辑,彻底避免运行时上下文获取的问题,完全贴合你想要的语法:
macro Ƥ($key) { quasi { with $_ { when Associative { $_{$key}:exists ?? $_{$key}.Str !! '' } } '' } } # 测试代码 my %h = %( aaa => { say Ƥ<content> } ); %h<aaa>.( %( :content('Hello world'), ) ); # 输出 Hello world %h<aaa>.( %( :other('test'), ) ); # 输出空字符串
方案二:自定义postcircumfix运算符
如果更偏好运算符风格,可以定义一个作用于$_的postcircumfix运算符,用法为$_Ƥ<key>:
sub postcircumfix:<Ƥ< >> (Associative:D $topic, Str:D $key) is raw { $topic{$key}:exists ?? $topic{$key}.Str !! '' } # 测试代码 my %h = %( aaa => { say $_Ƥ<content> } ); %h<aaa>.( %( :content('Hello world'), ) ); # 输出 Hello world
方案细节
- 宏方案通过编译时替换,既保证了性能,又完美匹配你期望的
Ƥ<key>语法。 - 宏内部用
with $_判断$_是否存在,再通过when Associative做类型检查,确保仅在$_是Associative类型时执行存在性检查,否则直接返回空字符串。
内容的提问来源于stack exchange,提问作者Richard Hainsworth
相关产品推荐
相关产品推荐

