Warum keine "jede" Methode für Perl6-Sequenzen?


14

Manchmal fange ich an, eine Kette von Methodenaufrufen im Perl 6 REPL zu schreiben, wie zum Beispiel:

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

... und dann wird mir klar, dass ich mit der endgültigen Liste jedes Element in einer eigenen Zeile drucken möchte. Ich würde erwarten, dass Sequenzen so etwas wie eine eachMethode haben, mit der ich die Kette beenden könnte .each(*.say), aber es gibt keine solche Methode, die ich finden kann. Stattdessen muss ich zum Anfang der Zeile zurückkehren und voranstellen .say for. Es fühlt sich an, als würde es den Fluss meiner Gedanken unterbrechen.

Es ist ein kleiner Ärger, aber es scheint mir eine so krasse Auslassung zu sein, dass ich mich frage, ob mir eine einfache Alternative fehlt. Die einzigen, an die ich denken kann, sind ».sayund .join("\n").say, aber die ersteren können die Elemente in unregelmäßiger Reihenfolge bearbeiten (wenn ich das richtig verstehe), und die letzteren konstruieren eine einzelne Zeichenfolge, die je nach Eingabeliste problematisch groß sein kann.

Antworten:


8

Wie Sie im Kommentar geschrieben haben, erstellt nur ein anderer .map(*.say)bei Verwendung von REPL eine Zeile mit True-Werten. Sie können versuchen, die .sinkMethode nach der letzten Map-Anweisung aufzurufen .

".".IO.dir.grep({$_.contains('e')}).map(*.uc).map(*.say).sink

Ich nehme an ... aber dann spuckt die REPL eine Liste von TrueWerten aus, die dieselbe Länge wie die Eingabeliste haben. Nicht ideal.
Sean

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}wird das gleiche tun, aber nur eine leere Liste in der REPL erwähnen
Elizabeth Mattijsen

Ich glaube, die REPL soll das Ergebnis einer Zeile nicht ausgeben, wenn es ausgegeben wurde; tut es das, indem es telldas Out-Dateihandle vor und nach dem Befehl aufruft und sie vergleicht, denke ich? Mit dieser Logik könnte also etwas schief gehen.
Timotimo

11

Sie können Ihre eigenen rollen.

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

Wenn Ihnen das gefällt, gibt es genau dort Ihre erste Möglichkeit für ein CPAN-Modul .


1
Tolle Antwort und Idee für ein CPAN-Modul. Sie könnten erwägen zu erwähnen, dass es zu einem regulären Sub gemacht und mit aufgerufen werden kann .&each(), falls sie nicht mit Augmenting herumspielen möchten.
user0721090601

Die Verwendung des .&each()Formats hat Nachteile, z. B. die Notwendigkeit, sich an eine einzelne Zeile zu halten (oder \ überall ziemlich unhandlich zu sein ).
Tyil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.