Czy można eksportować podzestawy w Raku?

9

Chciałbym zdefiniować kilka podzbiorów, do których również dodam kilka ograniczeń i kilka dieinstrukcji dla niektórych przydatnych komunikatów o błędach. Nie chcę ich definiować na górze modułu, który korzysta z tych podzbiorów, i zamiast tego chcę je umieścić w innym module, jednocześnie rezygnując z używania ich w pełni kwalifikowanych nazw (FQN). Na przykład mam

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

ale dostałem

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

To nie działało, pomyślałem, że zamiast tego mogę zrobić coś w następujący sposób, ale zastanawiam się, czy mógłbym tego uniknąć:

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
źródło
1
Na marginesie, istnieje wspólny moduł podzbiorów, który obejmuje PosInt: github.com/bradclawsie/Subsets-Common
user0721090601

Odpowiedzi:

12

Podzbiory można rzeczywiście eksportować. Problem polega na tym, że is exportcecha nie jest odpowiednio zastosowana do PosIntpodzbioru (i każdego innego podzbioru, który mógłbyś również chcieć wyeksportować); cechę należy zastosować natychmiast po zdefiniowaniu nowego typu i tuż przed wprowadzeniem jakichkolwiek ograniczeń where. Prawidłowe zastosowanie cechy:

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

następujące powinny działać poprawnie:

use Long::Module::Subsets;

unit Long::Module;

# ... some code here

my PosInt $age;
uzlxxxx
źródło