Fonctions d'ordre supérieur en zsh

Title image

UPDATE: Nicholas Sterling a découvert un moyen de faire des fonctions anonymes Merci!

Avec cette dernière version vous pouvez utiliser map si vous utilisez des fonctions déclarées. mapl pour les fonctions anonymes et mapa pour les fonctions arithmétiques.

Exemple :

tlpl: des fonctions d’ordres supérieurs en zsh.

Tout d’abord, pourquoi c’est important d’avoir ces fonctions. Plus je programmais avec zsh plus j’essayais d’avoir un style fonctionnel.

Le minimum pour pouvoir avoir du code plus lisible c’est de posséder les fonctions map, filter et fold.

Voici pourquoi avec une comparaison. Commençons par un programme qui converti tous les gif en png dans plusieurs répertoires projets contenant tous des répertoires resources. Avant :

Avant ⇒

  • Le (/N) permet de sélectionner seulement les répertoires sans casser la boucle s’il n’y a pas de “match”.
  • Le (.N) permet de sélection seulement les fichiers, aussi sans tout arréter s’il ne trouve rien.
  • Le :t signfie “tail” ; si toto=/path/to/file.ext alors ${toto:t}=file.ext.

Après

Plus de bloc ! Oui, c’est un poil plus difficile à lire pour les non initiés. Mais c’est à la fois plus concis et plus robuste.

Et encore ce code ne possède pas de test. Recommençons sur le même principe.

Trouver les fichiers des projets qui ne contiennent pas de s dans leur nom qui ont le même nom que leur projet.

Before ⇒

After ⇒

La première version peu paraître plus facile à lire. Mais la seconde est plus bien supérieure en terme d’architecture. Je ne veux pas discuster ici pourquoi c’est mieux. Je vous demande simplement de me croire quand je dis que l’approche fonctionnelle est supérieure.

Vous pouvez télécharger une version à jour du code (merci à Arash Rouhani). Une ancienne version est ici. Voici le code source (de la première version) :

Comments

comments powered by Disqus
Published on 2011-09-28
Follow @yogsototh
Yann Esposito©
Done with Vim spacemacs & nanoc Hakyll

ADA: DdzFFzCqrhtAvdkmATx5Fm8NPJViDy85ZBw13p4XcNzVzvQg8e3vWLXq23JQWFxPEXK6Kvhaxxe7oJt4VMYHxpA2vtCFiP8fziohN6Yp