Можно ли экспортировать подмножества в Raku?

9

Я хотел бы определить несколько подмножеств, к которым я также добавляю несколько ограничений и несколько dieоператоров для некоторых полезных сообщений об ошибках. Я не хочу определять их в верхней части модуля, который использует эти подмножества, и вместо этого хочу поместить их в другой модуль, а также отказаться от использования их полностью определенных имен (FQN). Например, у меня есть

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

но получил

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

Это не работает, я подумал, что вместо этого я мог бы сделать что-то, как указано ниже, но мне интересно, смогу ли я избежать этого:

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
источник
1
Как примечание, есть модуль общих подмножеств, который включает PosInt: github.com/bradclawsie/Subsets-Common
user0721090601

Ответы:

12

Подмножества действительно могут быть экспортированы. Проблема здесь в том, что эта is exportчерта неправильно применяется к PosIntподмножеству (и любому другому подмножеству, которое вы, возможно, также хотели бы экспортировать); Эта черта должна применяться сразу после определения нового типа и непосредственно перед любыми ограничениями, введенными с where. Правильно применив черту:

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

следующее должно работать нормально:

use Long::Module::Subsets;

unit Long::Module;

# ... some code here

my PosInt $age;
uzlxxxx
источник