Pourquoi pas de méthode «each» sur les séquences Perl6?

14

Parfois, je vais commencer à écrire une chaîne d'appels de méthode sur Perl 6 REPL, comme:

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

... et puis je me rends compte que ce que je veux faire avec la liste finale, c'est imprimer chaque élément sur sa propre ligne. Je m'attendrais à ce que les séquences aient quelque chose comme une eachméthode pour pouvoir terminer la chaîne .each(*.say), mais il n'y a pas de méthode comme celle-là que je puisse trouver. Au lieu de cela, je dois retourner au début de la ligne et ajouter .say for. J'ai l'impression que ça brise le flux de mes pensées.

C'est une gêne mineure, mais cela me semble être une omission si flagrante que je me demande si je manque une alternative facile. Les seuls auxquels je peux penser sont ».sayet .join("\n").say, mais les premiers peuvent fonctionner sur les éléments dans le désordre (si je comprends bien) et les seconds construisent une seule chaîne qui pourrait être problématiquement grande, selon la liste d'entrée.

Sean
la source

Réponses:

8

Comme vous l'avez écrit dans le commentaire, juste un autre .map(*.say)crée également une ligne avec des valeurs True lors de l'utilisation de REPL. Vous pouvez essayer d'appeler la .sinkméthode après la dernière instruction de mappage.

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink
Valle Lukas
la source
Je suppose ... mais alors le REPL crachera une liste de Truevaleurs de la même longueur que la liste d'entrée. Pas idéal.
Sean
".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}fera de même, mais ne mentionne qu'une liste vide dans le REPL
Elizabeth Mattijsen
Je crois que le REPL est destiné à ne pas sortir le résultat d'une ligne s'il y en a eu; il fait cela en appelant tellle descripteur de fichier out avant et après la commande et les compare, je pense? donc quelque chose pourrait mal tourner avec cette logique.
timotimo
11

Vous pouvez rouler le vôtre.

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 vous aimez cela, il y a votre opportunité de module First CPAN ici.

Holli
la source
1
Excellente réponse et idée pour un module CPAN. Vous pourriez envisager de mentionner qu'il peut être transformé en un sous-marin régulier et appelé avec .&each(), au cas où ils ne voudraient pas se brouiller avec l'augmentation.
user0721090601
L'utilisation du .&each()format présente des inconvénients, comme le fait d'être tenu de s'en tenir à une seule ligne (ou d'utiliser un peu lourd \ partout).
Tyil