bri*_*foy 14 perl6 multidispatch raku
我正在玩这个小东西,其中一组可以通过翻转测试来充当它的补充.为了实现这一目标,我创建了会员运营商的特殊版本.
class Complement {
    has $.set;
    }
multi infix:<?> ( $a, Complement:D $c ) { $a ? $c.set   }
multi infix:<?> ( $a, Complement:D $c ) { $a ? $c.set }
my $set = (1, 2, 3).Set;
my $c = Complement.new: set => $set;
put 3 ? $set;
put 4 ? $c;
根据我infix:<?>对另一个的定义,更普遍的似乎已经消失了.没有其他候选人:
True
Cannot resolve caller infix:<?>(Int, Set); none of these signatures match:
    ($a, Complement:D $c)
  in sub infix:<?> at /Users/brian/Desktop/complement.p6 line 11
  in block <unit> at /Users/brian/Desktop/complement.p6 line 18
我需要做些什么来保留以前使用不同签名的定义?
小智 14
这是因为&infix:<?>是多重的,而&infix:<?>不是:
$ perl6 -e '&infix:<?>.candidates.head.multi.say'
True
$ perl6 -e '&infix:<?>.candidates.head.multi.say'
False
当你定义了你的时候multi &infix:<?>,你会only &infix:<?>从核心阴影,这就是为什么你只看到你的候选人.
我们可能会检测到这种情况,并要求用户明确proto说明它们的含义.我把它作为R#1530提交.而且我会说这样的差异,一个操作是multi另一个操作是only一个更大的问题的一部分,具有一致的核心; 我将其添加为对RT#130020的评论,并在我们关于D#1783的文档中提到了这个问题.
您可以像这样定义自定义操作(如果实现了建议,R#1530则proto需要;当前不是):
proto infix:<?> (|) {*}
multi infix:<?> ($a, Complement:D $c) { $a ? $c.set }
multi infix:<?> (|c) { &CORE::infix:<?>(|c) }
我只能猜测你想要编码的是什么,但我想我会提到它,因为你在你的创作中考虑到它:否定的操作被定义为not A (op) B,而不是A (not(op)) B.这种微小差异对以下方面有影响Junctions:
$ perl6 -e 'say 2 ? 2|4'
False
如果将它定义为应用于每个操作数的否定操作,则上述内容将等同于(2 ? 2 or 2 ? 4)并且总是如此True,这通常不是程序员所指的那样,因此为什么它被计算为not (2 == 2 or 2 == 4)
回答Jarrod关于OP的评论:subs(包括通过声明自定义运算符完成的语法变异)是词法,所以如果你将声明包装到一个BEGIN块中,自定义op将被限定为该块.
它似乎在REPL中工作的原因是因为实际上存在一个错误(RT#131900),其中自定义操作在REPL行之间丢失,因此就像BEGIN块一样,当调用args指向核心候选者时,自定义多边形不再在范围内.