переменная-заполнитель perl6 и переменная темы - PullRequest
14 голосов
/ 06 мая 2019

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 06 мая 2019

Существует несколько переменных темы, по одной на каждый сигил: $ , @ ,% _ и даже & _ (да, процедуры в 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сокращение от делимого и деление на разделенное (которое вы могли бы использовать, если хотите).

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

11 голосов
/ 06 мая 2019

В теме могут быть вызовы методов:

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;
}

Гораздо меньше набирается, когда над одной и той же переменной много операций.

...