Sobrecarga del operador Raku

8

Usando el siguiente 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';
}

Resultados en:

(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

Mientras que cambiar el bloque comentado por la otra definición resulta en:

(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Truthy

La versión rota (con tres parámetros) es la que quiero, ¿alguien podría explicar por qué está rota?

hsmyers
fuente

Respuestas:

10

<5 0 10>literalmente construye un List, un solo List .

Una analogía sería una lista de cosas que hacer, una lista de tareas pendientes. ¿Cuántas cosas es una lista de tareas pendientes? Es 1 - una lista de tareas pendientes.

Por lo tanto, recibe el mensaje de error:

expected 3 arguments but got 1

Lo que desea es especificar que desea un valor que esté compuesto por varios valores. Aquí hay una forma de hacerlo:

sub circumfix:<α ω>( ( $a, $b, $c ) ) ...

El entorno adicional (y la )causa de la desestructuración .

raiph
fuente
1
Una alternativa podría ser utilizar una firma slurpy (*@foo where .elems == 3)que luego podría apoyar ya sea α $a, $b, $c ωoα ($a, $b, $c) ω
user0721090601
@ user0721090601 Los subsignos también son compatibles. Poner la riqueza de la firma en sub-sigs le da al compilador más conocimiento que una wherecláusula para que obtenga, por ejemplo, un mensaje de error predeterminado más agradable y una velocidad de envío Encuentro wheremejores cláusulas para condiciones arbitrarias que un subsigno no puede manejar o para definir un mensaje de error totalmente personalizado (por ejemplo ( *@ where { .elems == 3 or die "nope" } )). Tenga en cuenta que puede combinar estos: ( *@ where { .elems == 3 or die "nope" } ($a, $b, $c) )le da desestructuración en variables con nombre cuando obtiene los argumentos correctos y un mensaje de error personalizado cuando no lo hace.
raiph
1
++ los signos múltiples funcionarían para evitar el dónde, pero no me di cuenta de que uno podría usar el anónimo para desestructurar mientras proporcionaba un dónde (quiero decir, pensé que nunca se podía ver un ejemplo y es realmente legible, en realidad)
user0721090601
multi, mucho mejor que mi sugerencia de abusar de una wherecláusula para un caso de uso de error que se puede distinguir por múltiples firmas sin wherecláusulas. (En retrospectiva, me da vergüenza mi revelación de mis instintos más agresivos cuando serían tan innecesarios e inapropiados.) De todos modos, tenga otro voto positivo y gracias por mejorar nuestra respuesta con sus comentarios. :)
raiph
7
D:\>6e "say <5 0 10>"
(5 0 10)

Estos no son tres argumentos. Es una lista de tres valores (de tipo IntStr) y, por lo tanto, un solo argumento.

Holli
fuente