2016-01-10 4 views
7

Sto tentando di utilizzare map all'interno di un ciclo for, ma questo codice non funziona. Questo codice deve stampare 1 e 2 tre volte. Ma il codice sottostante non produce output. Funzionerà solo parzialmente se si decommenta la riga exit. Qualche idea del perché? L'ho provato usando l'attuale versione Perl 6 (versione Rakudo 2015.12-79-g4bb47d5 costruita su MoarVM versione 2015.12 e anche la versione Windows).Come posso usare "map" all'interno di un ciclo "for" in Perl 6?

for (1..3) { 
map { say $_ }, (1..2); 
# exit; 
} 

risposta

8

Diamo uno sguardo a

say (map { say $_ }, 1..2).WHAT; 

Questo ci dice &map restituisce un Seq, che è un costrutto pigro.

Inoltre, l'ultima istruzione nel corpo di un loop for viene utilizzato per aggregare il suo valore di ritorno, cf

my @list = do for 1..3 { 
    map { say $_ }, 1..2; 
} 

say .WHAT for @list; 

Se si aggiunge un'altra affermazione dopo la chiamata a &map, la chiamata sarà in 'lavandino contesto 'e viene valutato con entusiasmo.

Questo può anche essere costretti esplicitamente:

for 1..3 { 
    sink map { say $_ }, 1..2; 
} 

In alternativa, basta usare un'altra for ciclo:

for 1..3 { 
    .say for 1..2; 
} 
+1

È anche possibile forzare per essere una sequenza ansiosi utilizzando 'eager' invece di' sink'. Davvero 'for' dovrebbe semplicemente mettere tutte le sue istruzioni nel contesto' sink' se non è preceduto da un 'do' (' do per 1..3 {...} ') –

+5

Sembra che la lezione qui sia: stai attento a usando una funzione di filtro come la mappa per gli effetti collaterali come se fosse un loop. –