переменная-заполнитель perl6 и переменная темы
В Perl 6 есть как переменные-заполнители, так и переменные темы. Например, следующие два оператора одинаковы
say ( $_ * 2 for 3, 9 ); # use topic variables
say ( { $^i * 2 } for 3, 9 ); # use placeholder variables
Мне кажется, единственное преимущество, которое получают переменные темы, - это сохранение некоторых нажатий клавиш.
Мой вопрос: есть ли вариант использования, где переменная темы может быть намного более удобной, чем переменные-заполнители?
Ответы
Ответ 1
Тема может иметь вызовы методов:
say ( .rand for 3,9);
По сравнению с заполнителем:
say ( {$^i.rand} for 3,9);
Экономит на вводе имени переменной и фигурных скобок для блока.
Кроме того, переменная темы - весь смысл given
блока в моем понимании:
my @anArrayWithALongName=[1,2,3];
@anArrayWithALongName[1].say;
@anArrayWithALongName[1].sqrt;
#OR
given @anArrayWithALongName[1] {
.say;
.sqrt;
}
Это намного меньше печатает, когда над одной и той же переменной много операций.
Ответ 2
Существует несколько переменных темы, по одной для каждого сигилла: $, @,% _ и даже & _ (да, подпрограммы являются первоклассными гражданами в Perl6). До определенного момента вы также можете использовать Whither (*) и создать Wh WhidCode в выражении, сохранив еще больше текста (смотри, мам! Никаких фигурных скобок!).
Вы можете использовать форму массива для нескольких переменных:
my &block = { sum @_ }; say block( 2,3 )
Но главная проблема, с которой они сталкиваются, заключается в том, что они представляют собой отдельные переменные, неспособные отражать сложность вызовов блоков. Приведенный выше код можно переписать с помощью переменных-заполнителей, например:
my &block = { $^a + $^b }; say block( 2,3 )
Но представьте, что у вас есть некоммутативная вещь в ваших руках. Как здесь:
my &block = { @_[1] %% @_[0] }; say block( 3, 9 )
Это становится неуклюжим и менее выразительным, чем
my &block = { $^divi %% $^divd }; say block( 3, 9 ); # OUTPUT: «True»
Суть в том, что переменные-заполнители присваиваются в алфавитном порядке, где divd - перед divi, а divi - сокращение от divisible, а divd - для split (который вы могли бы использовать, если хотите).
В конце концов, есть много способов сделать это. Вы можете использовать то, что вы хотите.