perl6.suОсвоим perl6 к 2015 году!

nota LXXIII. Рутине рутинное


       Субрутина может быть валентна перечнем разных объектов: скаляров, массивов, хэшей и даже другими субрутинами.
    
#!/usr/bin/perl6
my @list=1 .. 5;
say routine(@list,sub (@quid) {return [+] @quid});
say routine(@list,sub (@quid) {return [*] @quid});
sub routine(@in,&act) {
	return "Итого: " ~ act(@in);
	}
Итого: 15
Итого: 120

       Это действительно удобно в плане избавления от повторяющихся участков кода. Допустим, мы выносим в одну субрутину сложный и большой алгоритм чего-то. Но в этом алгоритме, скажем, есть две переменные, с которыми можно производить разные действия в разных ситуациях. Можно использовать условные операторы, можно продублировать субрутины, можно использовать eval, но можно и передавать требуемые действия при вызове субрутины.
    
#!/usr/bin/perl6
my $res=routine(sub ($a,$b) {$a+$b});
say "$res (угадай какое было действие)";
$res=routine(sub ($a,$b) {$a-$b});
say "$res (угадай какое было действие)";
sub routine(&do) {
	# здесь большой
	# и сложный алгоритом
	# в одном месте которого
	# две переменные
	my $rand1=1000.rand.floor;
	my $rand2=1000.rand.floor;
	print "$rand1 ? $rand2 = ";
	do($rand1,$rand2);
	# могут обрабатываться
	# разными способами
	}
115 ? 992 = 1107 (угадай какое было действие)
737 ? 254 = 483 (угадай какое было действие)

       Получилась программа развития устного счета.
       А вот интересно стало. Если есть, допустим, список возможных действий <+ - * / ** log>, то как можно его прикрутить к данной программе без использования условий?
# mutatio postrema: 18 Sep 2010

   sub      charta situs       nota LXXII <<     >> nota LXXIV   

    RSS     stdin@perl6.su    © Alexius Karmanov, 2010-2011