Usando o seguinte código:
use v6d;
# sub circumfix:<α ω>( @a ) {
# @a[0] >= @a[1] & @a[0] <= @a[2];
# };
sub circumfix:<α ω>( $a, $b, $c ) {
$a >= $b & $a <= $c;
};
if (α <5 0 10> ω) {
say 'Truthy';
}
else {
say 'Falsey';
}
Resulta em:
(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Too few positionals passed; expected 3 arguments but got 1
in sub circumfix:<α ω> at ./op.p6 line 7
in block <unit> at ./op.p6 line 11
Enquanto a troca do bloco comentado pela outra definição resulta em:
(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Truthy
A versão quebrada (com três parâmetros) é a que eu quero, alguém poderia explicar por que está quebrada?
operator-overloading
raku
hsmyers
fonte
fonte
(*@foo where .elems == 3)
que poderia então suportarα $a, $b, $c ω
ouα ($a, $b, $c) ω
where
cláusula, para que você obtenha, por exemplo, uma mensagem de erro padrão mais agradável e velocidade de envio. Acho aswhere
cláusulas melhores para condições arbitrárias que um sub-sig não pode manipular ou para definir uma mensagem de erro totalmente personalizada (por exemplo( *@ where { .elems == 3 or die "nope" } )
). Observe que você pode combinar estes:( *@ where { .elems == 3 or die "nope" } ($a, $b, $c) )
fornece a você a destruição em variáveis nomeadas quando obtém o (s) argumento (s) correto (s) e uma mensagem de erro personalizada quando não obtém.multi
s, muito melhor do que minha sugestão de abusar de umawhere
cláusula para um caso de uso de erro que possa ser distinguido por várias assinaturas semwhere
cláusulas. (Em retrospecto, fico envergonhado com a revelação de meus instintos mais loucos, quando eles seriam tão desnecessários e inapropriados!) De qualquer forma, tenha outro voto positivo e obrigado por melhorar nossa resposta com seus comentários. :)Esses não são três argumentos. É uma lista de três valores (do tipo
IntStr
) e, portanto, um único argumento.fonte