Perché nessun metodo "ciascuno" sulle sequenze Perl6?


14

A volte inizierò a scrivere una catena di chiamate di metodo sul Perl 6 REPL, come:

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

... e poi mi rendo conto che quello che voglio fare con l'elenco finale è stampare ogni elemento sulla propria riga. Mi aspetto che le sequenze abbiano qualcosa come un eachmetodo in modo da poter terminare la catena .each(*.say), ma non esiste un metodo come quello che riesco a trovare. Invece devo tornare all'inizio della riga e anteporre .say for. Sembra che interrompa il flusso dei miei pensieri.

È un piccolo fastidio, ma mi sembra un'omissione così evidente che mi chiedo se mi manca qualche alternativa facile. Le uniche a cui riesco a pensare sono ».saye .join("\n").say, ma la prima può operare sugli elementi fuori ordine (se ho capito bene) e la seconda costruisce una singola stringa che potrebbe essere problematicamente grande, a seconda dell'elenco di input.

Risposte:


8

Come hai scritto nel commento, solo un altro .map(*.say)crea una riga con valori True quando si utilizza REPL. Puoi provare a chiamare il .sinkmetodo dopo l'ultima istruzione della mappa.

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

Suppongo ... ma poi il REPL sputerà un elenco di Truevalori della stessa lunghezza dell'elenco di input. Non ideale
Sean,

".".IO.dir.grep(*.contains("e")).map(*.uc).map: {.say; Empty}farà lo stesso, ma menzionerà solo un elenco vuoto nella REPL
Elizabeth Mattijsen,

Credo che il REPL non debba produrre il risultato di una riga se è stato prodotto; lo fa chiamando tellil filehandle out prima e dopo il comando e li confronta, penso? quindi qualcosa potrebbe andare storto con quella logica.
timotimo,

11

Puoi farlo tu stesso.

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 ti piace, c'è la tua prima opportunità del modulo CPAN proprio lì.


1
Ottima risposta e idea per un modulo CPAN. Potresti considerare di menzionare che può essere trasformato in un sub secondario e chiamato con .&each(), nel caso in cui non vogliano confondersi con l'aumento.
user0721090601

L'uso del .&each()formato comporta degli aspetti negativi, come ad esempio la necessità di attenersi a una singola riga (o utilizzare piuttosto ingombranti in \ tutto il luogo).
Tyil,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.