Carte pour les listes imbriquées
Disons que vous avez une liste imbriquée, comme une matrice:
[[0 1 2][3 4 5][6 7 8]]
Ou un tableau de chaînes:
["foo""bar"]
Et vous voulez mapper un bloc sur le niveau imbriqué (c'est-à-dire l'appliquer à chaque nombre ou à chaque caractère). La solution naïve est un imbriqué %
:
{{...}%}%
Cependant, vous pouvez réellement pousser le bloc interne sur la pile, puis l'utiliser f%
. f
est "mapper avec un paramètre supplémentaire", donc il mappera %
sur la liste externe, en utilisant le bloc comme second paramètre:
{...}f%
Enregistre deux octets.
Une autre astuce pour faire quelque chose for (i=0; i<5; ++i) for (j=0; j<5; ++j) {...}
est comme
5,_f{f{...}}
L'extérieur f
mappera sur la première plage, fournissant la deuxième plage comme paramètre supplémentaire. Mais maintenant, si vous utilisez à f
nouveau, seul l'élément de pile supérieur est un tableau. Vous pouvez donc f
mapper le bloc interne sur celui-ci, en fournissant la "variable d'itération" externe en tant que paramètre supplémentaire. Cela signifie que le bloc interne est exécuté avec i
et j
sur la pile.
Cela a le même nombre de caractères que de simplement mapper un bloc sur un produit cartésien (bien que ce dernier soit plus court si vous avez besoin des paires sous forme de tableaux):
5,_m*{~...}%
La différence réside dans le fait que cette version génère un seul tableau de résultats pour toutes les paires, alors que la version double f
génère une liste imbriquée, ce qui peut être utile si vous souhaitez stocker les résultats dans une grille, les variables d'itérateur constituant les coordonnées.
Merci à Dennis de m'avoir montré cette astuce.
0.6.4 Mise à jour
f
et :
ont maintenant été immensément améliorés en prenant n'importe quel autre opérateur, y compris eux-mêmes. Cela signifie que vous pouvez économiser encore plus d'octets maintenant. Le mappage d'un opérateur sur une liste imbriquée s'est encore raccourci:
{:x}%
{x}f%
::x
Cela n’aide pas vraiment à mapper des blocs sur des listes imbriquées.
Quant aux blocs ou opérateurs appliqués au produit cartésien, ils ont également été raccourcis, aussi bien pour les blocs que pour les opérateurs:
5,_f{f{...}}
5,_ff{...}
5,_f{fx}
5,_ffx
Ce qui est bien, c'est que vous pouvez maintenant les imbriquer. Vous pouvez donc aussi facilement appliquer un opérateur au troisième niveau d'une liste:
:::x
Ou un bloc avec quelques ruses:
{...}ff%