Mapa list zagnieżdżonych
Załóżmy, że masz zagnieżdżoną listę, na przykład macierz:
[[0 1 2][3 4 5][6 7 8]]
Lub tablica ciągów:
["foo""bar"]
I chcesz zmapować blok na poziom zagnieżdżony (tj. Zastosować go do każdej liczby lub każdego znaku). Naiwnym rozwiązaniem jest zagnieżdżenie %:
{{...}%}%
Możesz jednak wcisnąć blok wewnętrzny na stos, a następnie użyć f%. fjest „mapuj z dodatkowym parametrem”, więc będzie %mapowany na listę zewnętrzną, używając bloku jako drugiego parametru:
{...}f%
Zapisuje dwa bajty.
Kolejną zgrabną sztuczką, aby zrobić coś takiego for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}jest
5,_f{f{...}}
Zewnętrzne fmapuje na pierwszy zakres, podając drugi zakres jako dodatkowy parametr. Ale teraz, jeśli użyjesz go fponownie, tylko górny element stosu jest tablicą, więc fodwzorowujesz na nim blok wewnętrzny, podając zewnętrzną „zmienną iteracyjną” jako dodatkowy parametr. Oznacza to, że wewnętrzny blok jest uruchamiana z ii jna stos.
Ma taką samą liczbę znaków, jak zwykłe mapowanie bloku na iloczyn kartezjański (chociaż ten drugi staje się krótszy, jeśli potrzebujesz par jako tablic):
5,_m*{~...}%
Różnica polega na tym, że ta wersja daje jedną tablicę wyników dla wszystkich par, podczas gdy podwójna fdaje zagnieżdżoną listę, co może być przydatne, jeśli chcesz zapisać wyniki w siatce, przy czym zmienne iteratora są współrzędnymi.
Dzięki Dennisowi za pokazanie mi tej sztuczki.
0.6.4 Aktualizacja
fi :zostały teraz znacznie ulepszone poprzez włączenie dowolnego innego operatora, w tym siebie. Oznacza to, że możesz teraz zaoszczędzić jeszcze więcej bajtów. Mapowanie operatora na zagnieżdżonej liście jest teraz jeszcze krótsze:
{:x}%
{x}f%
::x
Nie pomaga to jednak w mapowaniu bloków na listy zagnieżdżone.
Jeśli chodzi o stosowanie bloków lub operatorów do produktu kartezjańskiego, teraz również stało się to krótsze, zarówno dla bloków, jak i operatorów:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Fajne jest to, że możesz je teraz zagnieżdżać. Możesz więc równie łatwo zastosować operatora do trzeciego poziomu w dół listy:
:::x
Lub blok z pewnymi sztuczkami:
{...}ff%