¿Se pueden exportar subconjuntos en Raku?

9

Me gustaría definir algunos subconjuntos a los que también estoy agregando algunas restricciones y algunas diedeclaraciones para algunos mensajes de error útiles. No quiero definirlos en la parte superior del módulo que usa esos subconjuntos y, en cambio, quiero colocarlos en otro módulo y al mismo tiempo eliminar el uso de sus nombres totalmente calificados (FQN). Por ejemplo, tengo

unit module Long::Module::Subsets;

subset PosInt
where ($_ ~~ Int || "The value must be an integer")
   && ($_ > 0    || "The value must be greater than 0")
is export
;

# other subsets ...

pero tengo

===SORRY!=== Error while compiling /tmp/637321813/main.pl6
Two terms in a row ...

Al no funcionar, pensé que podría hacer algo de la siguiente manera, pero me pregunto si podría evitar hacerlo:

use Long::Module::Subsets;

unit Long::Module;

my constant PosInt = Long::Module::Subsets::PosInt;
my constant Byte   = Long::Module::Subsets::Byte;
# ... more subsets here

# ... some code here

my PosInt $age;
uzlxxxx
fuente
1
Como nota al margen, hay un módulo de subconjuntos comunes que incluye PosInt: github.com/bradclawsie/Subsets-Common
user0721090601

Respuestas:

12

Los subconjuntos pueden exportarse. El problema aquí es que el is exportrasgo no se aplica correctamente al PosIntsubconjunto (y a cualquier otro subconjunto que también haya deseado exportar); el rasgo debe aplicarse inmediatamente después de que se haya definido el nuevo tipo y justo antes de cualquier restricción introducida con where. Al aplicar el rasgo correctamente:

unit module Long::Module::Subsets;

subset PosInt is export
where ($_ ~~ Int || "The value must be an integer")
   && ($_ > 0    || "The value must be greater than 0")
;

# other subsets ...

lo siguiente debería funcionar bien:

use Long::Module::Subsets;

unit Long::Module;

# ... some code here

my PosInt $age;
uzlxxxx
fuente