Mappa per elenchi nidificati
Supponi di avere un elenco nidificato, come una matrice:
[[0 1 2][3 4 5][6 7 8]]
O una serie di stringhe:
["foo""bar"]
E vuoi mappare un blocco sul livello nidificato (cioè applicarlo a ciascun numero o ciascun personaggio). La soluzione ingenua è un nidificato %:
{{...}%}%
Tuttavia, puoi effettivamente spingere il blocco interno sulla pila e quindi utilizzare f%. fè "mappa con parametro aggiuntivo", quindi verrà mappata %sull'elenco esterno, usando il blocco come secondo parametro:
{...}f%
Salva due byte.
Un altro trucco per fare qualcosa del genere for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}è
5,_f{f{...}}
L'esterno fverrà mappato sul primo intervallo, fornendo il secondo intervallo come parametro aggiuntivo. Ma ora, se lo usi di fnuovo, solo l'elemento stack superiore è un array, quindi fmappi il blocco interno su quello, fornendo la "variabile di iterazione" esterna come parametro aggiuntivo. Ciò significa che il blocco interno viene eseguito con ie jsullo stack.
Questo ha lo stesso numero di caratteri della semplice mappatura di un blocco su un prodotto cartesiano (sebbene quest'ultimo si accorcia se si necessitano le coppie come matrici):
5,_m*{~...}%
La differenza è che questa versione produce un singolo array di risultati per tutte le coppie, mentre il doppio fproduce un elenco nidificato, che può essere utile se si desidera archiviare i risultati in una griglia, con le variabili iteratore come coordinate.
Grazie a Dennis per avermi mostrato questo trucco.
0.6.4 Aggiornamento
fe :ora sono stati immensamente migliorati prendendo qualsiasi altro operatore incluso se stessi. Ciò significa che ora puoi salvare ancora più byte. La mappatura di un operatore su un elenco nidificato è diventata ancora più breve ora:
{:x}%
{x}f%
::x
Questo non aiuta molto a mappare i blocchi su elenchi nidificati.
Per quanto riguarda l'applicazione di blocchi o operatori al prodotto cartesiano, anche questo è diventato più breve ora, sia per i blocchi che per gli operatori:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
La cosa bella è che ora puoi nidificarli. Quindi puoi applicare un operatore altrettanto facilmente al terzo livello in fondo a un elenco:
:::x
O un blocco con qualche trucco:
{...}ff%