Por que nenhum método "cada" nas sequências Perl6?

14

Às vezes, começarei a escrever uma cadeia de chamadas de método no Perl 6 REPL, como:

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

... e então percebo que o que quero fazer com a lista final é imprimir todos os elementos em sua própria linha. Eu esperaria que as sequências tivessem algo como um eachmétodo para que eu pudesse terminar a cadeia .each(*.say), mas não há nenhum método como esse que eu possa encontrar. Em vez disso, tenho que voltar ao início da linha e preceder .say for. Parece que interrompe o fluxo dos meus pensamentos.

É um pequeno aborrecimento, mas me parece uma omissão tão flagrante que me pergunto se estou perdendo alguma alternativa fácil. Os únicos em que consigo pensar são ».saye .join("\n").say, mas o primeiro pode operar com elementos fora de ordem (se bem entendi) e o segundo constrói uma única sequência que pode ser problemáticamente grande, dependendo da lista de entrada.

Sean
fonte

Respostas:

8

Como você escreveu no comentário, apenas um outro .map(*.say)também cria uma linha com valores True ao usar o REPL. Você pode tentar chamar o .sinkmétodo após a última instrução do mapa.

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink
Valle Lukas
fonte
Suponho ... mas o REPL cuspirá uma lista de Truevalores do mesmo tamanho que a lista de entrada. Não é ideal.
Sean
".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}fará o mesmo, mas mencione apenas uma lista vazia no REPL
Elizabeth Mattijsen
Eu acredito que o REPL não deve produzir o resultado de uma linha se houver saída; isso é feito chamando tello manipulador de arquivos externo antes e depois do comando e comparando-os, eu acho? então algo pode estar errado com essa lógica.
timotimo 3/10/19
11

Você pode rolar sozinho.

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

Se você gosta disso, aqui está a sua primeira oportunidade de módulo CPAN .

Holli
fonte
11
Ótima resposta e idéia para um módulo CPAN. Você pode mencionar que ele pode ser transformado em um submarino comum e chamado com .&each(), caso eles não desejem interferir no aumento.
user0721090601
O uso do .&each()formato vem com desvantagens, como a necessidade de manter uma única linha (ou usar um pouco pesado em \ todo o lugar).
21419 Tyil