Почему нет метода «каждый» в последовательностях Perl6?

14

Иногда я начинаю писать цепочку вызовов методов в Perl 6 REPL, например:

".".IO.dir.grep(...).map(...).

... и затем я понимаю, что я хочу сделать с окончательным списком печать каждого элемента в отдельной строке. Я ожидал бы, что у последовательностей будет что-то вроде eachметода, чтобы я мог закончить цепочку .each(*.say), но нет такого метода, который я мог бы найти. Вместо этого я должен вернуться к началу строки и подготовить .say for. Такое ощущение, что это нарушает поток моих мыслей.

Это незначительное раздражение, но это кажется мне таким вопиющим упущением, что я задаюсь вопросом, упускаю ли я какую-то легкую альтернативу. Единственное, о чем я могу думать, это ».sayи .join("\n").say, но первое может работать с элементами не по порядку (если я правильно понимаю), а второе создает единственную строку, которая может быть проблематично большой, в зависимости от списка ввода.

Шон
источник

Ответы:

8

Как вы написали в комментарии, только другой .map(*.say)также создает строку со значениями True при использовании REPL. Вы можете попытаться вызвать .sinkметод после последнего оператора map.

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink
Valle Lukas
источник
Я полагаю ... но тогда REPL выдаст список Trueзначений той же длины, что и входной список. Не идеально.
Шон
".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}будет делать то же самое, но только упомянуть пустой список в REPL
Элизабет Маттийсен,
Я полагаю, что REPL предназначен для того, чтобы не выводить результат строки, если она была выведена; он делает это, вызывая tellдескриптор файла out до и после команды и сравнивая их, я думаю? так что что-то может пойти не так с этой логикой.
timotimo
11

Вы можете свернуть свой собственный.

use MONKEY;

augment class Any 
{ 
    method each( &block )
    {
        for self -> $value { 
            &block( $value );
        }
    }
};

List.^compose;
Seq.^compose;

(1, 2).each({ .say });
(2, 3).map(* + 1).each({ .say });

# 1
# 2
# 3
# 4

Если вам это нравится, у вас есть возможность первого модуля CPAN .

Holli
источник
1
Отличный ответ и идея для модуля CPAN. Вы можете упомянуть, что его можно превратить в обычную подпрограмму и .&each()вызвать с помощью , если они не хотят возиться с дополнением.
user0721090601
Использование .&each()формата сопряжено с недостатками, такими как необходимость придерживаться одной строки (или использовать довольно громоздко \ повсюду).
Tyil