Что касается первого вопроса, вы можете создавать динамические подпрограммы, возвращая подпрограмму из другого. Чтобы принять только параметр Ampere
(где "Ampere" выбирается программно), используйте захват типа в сигнатуре функции:
sub make-combiner(Any:U ::Type $, &combine-logic) {
return sub (Type $a, Type $b) {
return combine-logic($a, $b);
}
}
my &int-adder = make-combiner Int, {$^a + $^b};
say int-adder(1, 2);
my &list-adder = make-combiner List, {(|$^a, |$^b)};
say list-adder(<a b>, <c d>);
say list-adder(1, <c d>); # Constraint type check fails
Обратите внимание: когда я определил внутренний sub
, мне пришлось поставить пробел после ключевого слова sub
, чтобы компилятор не подумал, что я вызываю функцию с именем «sub». (Смотрите в конце моего ответа еще один способ сделать это.)
Теперь перейдем к самому сложному: как экспортировать одну из этих сгенерированных функций? Документация о том, что действительно делает is export
, находится здесь: https://docs.perl6.org/language/modules.html#is_export
На полпути вниз по странице есть пример добавления функции в таблицу символов без возможности записи is export
во время компиляции. Чтобы все вышеописанное работало, оно должно быть в отдельном файле. Чтобы увидеть пример программно определенного имени и программно определенной логики, создайте следующий MyModule.pm6:
unit module MyModule;
sub make-combiner(Any:U ::Type $, &combine-logic) {
anon sub combiner(Type $a, Type $b) {
return combine-logic($a, $b);
}
}
my Str $name = 'int';
my $type = Int;
my package EXPORT::DEFAULT {
OUR::{"&{$name}-eater"} := make-combiner $type, {$^a + $^b};
}
Вызов Perl 6:
perl6 -I. -MMyModule -e "say int-eater(4, 3);"
Как и ожидалось, на выходе будет 7. Обратите внимание, что в этой версии я использовал anon sub
, что позволяет вам назвать "анонимную" сгенерированную функцию. Я понимаю, что это в основном полезно для создания лучших трассировок стека.
С учетом всего сказанного, у меня возникли проблемы с динамической установкой приоритета постфиксного оператора. Я думаю, вам нужно изменить Precedence
роль оператора или создать ее самостоятельно, вместо того, чтобы позволять компилятору создавать ее за вас. Это не задокументировано.
person
piojo
schedule
06.11.2017