novembre
2010
Dans une discussion sur des structures de contrôle alternatives, une personne sur le site social StackOverflow disait désirer un contrôle qu’il appelait alternate qui permettrait de boucler parmis un choix de valeurs. Voici quelques exemples d’usages qu’il donnait:
table_row_color = alternate(RED, GREEN, BLUE); player_color = alternate(color_list); // cycles through list items alternate( led_on(), led_off() );
Pour les gens qui utilisent des langages avec des fermetures (closures en anglais) ont la possibilité d’implémenter ce genre de mécanisme eux mêmes. Je vais démontrer comme le faire avec le langage JavaScript, mais il est trivial de convertir ce code dans un autre langage.
function cycle(choix) { var i = 0; return function () { var courant = i; i = (i + 1) % choix.length; return choix[courant]; }; }
Si simple, n’est-ce pas? Voici une brève explication de comment cela fonctionne.
À l’intérieur du corps de cycle(), nous avons deux variables locales: choix et i. La fonction anonyme que nous retournons a accès à ces variables. Et plus intéressant, même si choix et i tombent hors-portée après le retour, la fonction anonyme retournée peut quand même y accéder. Cela lui permet donc de manipuler choix et i et de leur assigner des nouvelles valeurs.
Voici maintenant comment on pourrait se servir de ce code:
var couleurs = cycle(["bleu", "blanc", "rouge"]); // couleurs est une fonction for (var i = 0; i < 5; ++i) { console.log(couleurs()); } // Sortie => // blue // blanc // rouge // bleu // blanc
Il est également possible de cycler des fonctions:
var salutations = cycles([ function (s) { return "Bonjour " + s; }, function (s) { return "Salut " + s; }, function (s) { return "Allo " + s; } ]); for (var i = 0; i < 3; ++i) { console.log(salutations()("developpez.net")); } // Sortie => // Bonjour developpez.net // Salut developpez.net // Allo developpez.net
Si vous ne connaissez pas beaucoup les fermetures et qu’elles sont disponibles dans votre langage de programmation de choix, je vous suggère fortement de trouver un livre ou un tutoriel qui vous fera découvrir leur puissance.