Mapa para listas aninhadas
Digamos que você tenha uma lista aninhada, como uma matriz:
[[0 1 2][3 4 5][6 7 8]]
Ou uma matriz de strings:
["foo""bar"]
E você deseja mapear um bloco no nível aninhado (ou seja, aplicá-lo a cada número ou cada caractere). A solução ingênua é aninhada %
:
{{...}%}%
No entanto, você pode realmente empurrar o bloco interno para a pilha e usá-lo f%
. f
é "map com parâmetro adicional", portanto, ele será mapeado %
para a lista externa, usando o bloco como o segundo parâmetro:
{...}f%
Salva dois bytes.
Outro truque interessante para fazer algo como for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}
é
5,_f{f{...}}
O externo f
será mapeado para o primeiro intervalo, fornecendo o segundo intervalo como um parâmetro adicional. Mas agora, se você usar f
novamente, apenas o elemento superior da pilha é uma matriz, então você f
mapeia o bloco interno para isso, fornecendo a "variável de iteração" externa como um parâmetro adicional. Isso significa que o bloco interno é executado com i
e j
na pilha.
Isso tem o mesmo número de caracteres do que apenas mapear um bloco em um produto cartesiano (embora o último fique mais curto se você precisar dos pares como matrizes):
5,_m*{~...}%
A diferença é que esta versão gera uma única matriz de resultados para todos os pares, enquanto a dupla f
produz uma lista aninhada, que pode ser útil se você deseja armazenar os resultados em uma grade, com as variáveis do iterador sendo as coordenadas.
Agradeço ao Dennis por me mostrar esse truque.
0.6.4 Atualizar
f
e :
agora foram imensamente aprimorados com a utilização de qualquer outro operador, inclusive eles próprios. Isso significa que você pode salvar ainda mais bytes agora. O mapeamento de um operador em uma lista aninhada ficou ainda mais curto agora:
{:x}%
{x}f%
::x
Isso realmente não ajuda no mapeamento de blocos para listas aninhadas.
Quanto à aplicação de blocos ou operadores ao produto cartesiano, isso também ficou mais curto agora, tanto para blocos quanto para operadores:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
O legal é que agora você pode aninhar isso. Assim, você pode aplicar um operador com a mesma facilidade ao terceiro nível de uma lista:
:::x
Ou um bloco com alguns truques:
{...}ff%