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

в 18:47, , рубрики: feed, perl, 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;

Автор: SLY_G

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js