переменная-заполнитель perl6 и переменная темы - программирование

переменная-заполнитель perl6 и переменная темы

В Perl 6 есть как переменные-заполнители, так и переменные темы. Например, следующие два оператора одинаковы

say ( $_ * 2 for 3, 9 );        # use topic variables                 
say ( { $^i * 2 } for 3, 9 );   # use placeholder variables

Мне кажется, единственное преимущество, которое получают переменные темы, - это сохранение некоторых нажатий клавиш.

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

4b9b3361

Ответ 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 (который вы могли бы использовать, если хотите).

В конце концов, есть много способов сделать это. Вы можете использовать то, что вы хотите.