Скармливающие операторы в Perl 6

от автора

Программисты Perl 5 сталкивались с такой структурой в коде:

    my @new = sort { ... } map { ... } grep { ... } @original; 

Здесь данные идут справа налево, от массива @original, который скармливают в grep, который, в свою очередь, скармливает данные в map, а тот в sort, и в конце всё это присваивается массиву @new. Каждый из них принимает список в качестве аргумента.

В Perl 6 потоки данных передаются непосредственно через скармливающий оператор. Представленный пример можно записать в таком виде в Perl 6:

     my @new <== sort { ... } <== map { ... } <== grep { ... } <== @original; 

Принцип TMTOWTDI никуда не делся. Это же можно записать почти так же, как это было в Perl 5:

    my @new = sort { ... }, map { ... }, grep { ... }, @original; 

Разница только в запятых.

Что же даёт нам этот оператор? Читая код, вы делаете это слева направо. В коде Perl 5 вы можете прочитать пример слева направо, а потом окажется, что работает он справа налево. В Perl 6 появился синтаксический маркер, который наглядно показывает направление потока данных.

Чтобы улучшить читаемость кода и повернуть поток данных в нужном направлении, слева направо, существует специальный скармливающий оператор:

    @original ==> grep { ... } ==> map { ... } ==> sort { ... }  ==> my @new; 

Работает это точно так же, как и предыдущий вариант, просто данные идут слева направо. Вот ещё примеры реального применения этого оператора в коде:

    my @random-nums = (1..100).pick(*);     my @odds-squared <== sort() <== map { $_ ** 2 } <== grep { $_ % 2 } <== @random-nums;     say ~@odds-squared;      my @rakudo-people = <scott patrick carl moritz jonathan jerry stephen>;     @rakudo-people ==> grep { /at/ } ==> map { .ucfirst } ==> my @who-it's-at;     say ~@who-it's-at; 

ссылка на оригинал статьи http://habrahabr.ru/post/253701/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *