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 f
verrà mappato sul primo intervallo, fornendo il secondo intervallo come parametro aggiuntivo. Ma ora, se lo usi di f
nuovo, solo l'elemento stack superiore è un array, quindi f
mappi il blocco interno su quello, fornendo la "variabile di iterazione" esterna come parametro aggiuntivo. Ciò significa che il blocco interno viene eseguito con i
e j
sullo 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 f
produce 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
f
e :
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%