Subconjuntos podem ser exportados em Raku?

9

Gostaria de definir alguns subconjuntos aos quais também estou adicionando algumas restrições e algumas dieinstruções para algumas mensagens de erro úteis. Não quero defini-los na parte superior do módulo que usa esses subconjuntos e, em vez disso, quero colocá-los em outro módulo, além de acabar com o uso de seus nomes totalmente qualificados (FQNs). Por exemplo, eu tenho

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 ...

mas tenho

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

Isso não funcionou, imaginei que poderia fazer algo da seguinte maneira, mas estou me perguntando se poderia evitar:

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
fonte
11
Como uma observação lateral, há um módulo de subconjuntos comum que inclui PosInt: github.com/bradclawsie/Subsets-Common
user0721090601

Respostas:

12

Subconjuntos podem realmente ser exportados. O problema aqui é que a is exportcaracterística não é aplicada corretamente ao PosIntsubconjunto (e a qualquer outro subconjunto que você também deseje exportar); a característica deve ser aplicada imediatamente após a definição do novo tipo e logo antes de qualquer restrição introduzida where. Aplicando a característica corretamente:

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 ...

o seguinte deve funcionar bem:

use Long::Module::Subsets;

unit Long::Module;

# ... some code here

my PosInt $age;
uzlxxxx
fonte