¿Por qué no hay un método "cada" en las secuencias Perl6?

14

A veces empiezo a escribir una cadena de llamadas a métodos en Perl 6 REPL, como:

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

... y luego me doy cuenta de que lo que quiero hacer con la lista final es imprimir cada elemento en su propia línea. Esperaría que las secuencias tengan algo así como un eachmétodo para poder terminar la cadena .each(*.say), pero no hay un método como ese que pueda encontrar. En cambio, tengo que volver al comienzo de la línea y anteponer .say for. Parece que rompe el flujo de mis pensamientos.

Es una molestia menor, pero me parece una omisión tan evidente que me pregunto si me estoy perdiendo alguna alternativa fácil. Los únicos en los que puedo pensar son ».sayy .join("\n").say, pero el primero puede operar en los elementos fuera de orden (si lo entiendo correctamente) y el segundo construye una sola cadena que podría ser problemáticamente grande, dependiendo de la lista de entrada.

Sean
fuente

Respuestas:

8

Como escribió en el comentario, solo un otro .map(*.say)también crea una línea con valores verdaderos cuando usa REPL. Puede intentar llamar al .sinkmétodo después de la última declaración del mapa.

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink
Valle Lukas
fuente
Supongo ... pero entonces el REPL escupirá una lista de Truevalores de la misma longitud que la lista de entrada. No es ideal.
Sean
".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}hará lo mismo, pero solo mencionará una lista vacía en la REPL
Elizabeth Mattijsen el
Creo que REPL está destinado a no generar el resultado de una línea si se ha emitido; lo hace llamando tellal archivo de salida antes y después del comando y los compara, creo? entonces algo podría estar yendo mal con esa lógica.
timotimo
11

Puedes rodar el tuyo.

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

Si le gusta esto, está su oportunidad de primer módulo CPAN allí mismo.

Holli
fuente
1
Gran respuesta e idea para un módulo CPAN. Puede considerar mencionar que se puede convertir en un sub regular y llamar con .&each(), en caso de que no quieran confundirse con el aumento.
user0721090601
El uso del .&each()formato viene con desventajas, como la obligación de seguir una sola línea (o usar bastante difícil de manejar por \ todas partes).
Tyil