Lua: Le tutoriel  wxWidgets
Lua
Les fonctions: Les fonctions anonymes.

Avec LUA, une fonction est une valeur, au même titre que les nombres et les chaînes de caractères.

A ce titre, elle peut être stockée comme une variable locale ou globale, une table, peut être passée comme argument et elle peut aussi être retournée par une autre fonction.

Une fonction n'a pas de nom.
Lorsque vous parlez de la fonction print() vous parlez en fait du nom de la variable qui contient la fonction.

La définition d'une fonction, est une déclaration qui assigne une valeur de type function à une variable.

L'expression function(x) ... end est un constructeur de fonction, tout comme {} est un constructeur de table. ( voir la chapitre consacré aux tables)

Le résultat d'un constructeur de fonction est appelé: "fonction anonyme". ( càd qui n'a pas de nom!!! )

Mais avec Lua, toute fonction est avant tout UNE FONCTION ANONYME...

Rappelez-vous, dans le paragraphe définition, vous avez vu que:
function f() .. corps .. end  	 -- fonction nominative

  -- est équivalent à:
  
f = function() .. corps ..  end  -- fonction anonyme		
				

Une fonction anonyme est constituée d'un bloc de code réutilisable comme une fonction, appelable comme une fonction, mais sans nom...

Mais, me diriez-vous, puisqu'elle n'a pas de nom, comment faire pour l'appeler?

Bonne question. Et bien c'est très simple, pour déclarer une fonction anonyme, il vous suffit de faire comme pour une fonction classique, mais sans indiquer de nom.

function(arg)
  -- Corps de la fonction
end  
				

Super, et comment fait-on pour exécuter cette fonction, puisqu'elle ne possède toujours pas de nom?

-- En l'affectant à une variable
local var1 = function() ... end

-- Ou en la plaçant à l'intérieur d'une autre fonction
function MaFonction( )
  FonctionLua( function(arg) 
    ... -- ici se situe la fonction anonyme
  end) 
end
				

C'est bien beau tout ça, me diriez-vous, mais à quoi ça sert?

Concrètement, à rien.
Il n'existe aucune opération qu'on fasse avec une fonction anonyme qu'on ne puisse faire avec une fonction dite "normale".
On utilise les fonctions anonymes par goût, pour des raisons de style.

Les fonctions anonymes sont très pratiques pour créer des fonctions "jetables": lorsque l'on a besoin d'utiliser une fonction qu'une seule fois.

On ne compte pas la réutiliser, donc inutile de la mettre à part: on la définit et on la passe en callback* tout de suite.

Si vous développez avec la bibliothèque graphique « wxWidgets », vous vous apercevrez que les fonctions anonymes sont très utilisées pour effectuer les connections aux évènements.

-- Connecte l'évènement fermeture de la fenêtre.
frame:Connect(wx.wxEVT_CLOSE_WINDOW, function(event) 
				frame:Destroy(); event:Skip() 
			  end)
				

L'exemple qui va suivre, utilise une fonction de tri, extraite de la bibliothèque Lua sur les tables. ( Les tables seront abordées au prochain chapitre )

-- Considérez le tableau suivant:
local maTable = {2, 6, 7, 9, 0, 3, 5, 1, 4, 8}	
			
-- Pour ranger ces chiffres dans un ordre croissant, il suffit d'utiliser la 
-- fonction suivante:
table.sort(maTable)	
-- Cette fonction trie le contenu d'une table dans un ordre croissant et
-- renvoie le résultat directement dans la table d'origine.

-- Maintenant, afin de vérifier le nouveau classement de la table, vous  
-- pouvez afficher son contenu.
-- Mais, vous ne pouvez pas passer directement par la fonction print(), car 
-- elle renverrait le N° de la table et non son contenu.

-- Dans notre exemple, vous pouvez utiliser la fonction suivante:
print(table.concat(maTable))	--> 123456789

-- Les chiffres sont dans le bon ordre, mais difficilement lisible.
-- Pour améliorer cela:
print(table.concat(maTable, ", "))	--> 1, 2, 3, 4, 5, 6, 7, 8, 9	
				

Et si vous préférez voir s'afficher les chiffres dans un ordre décroissant... et bien faite intervenir la "fonction anonyme".

table.sort(maTable, function(t1, t2) 
			return (t1 > t2)
			end)

print(table.concat(maTable, ", "))	--> 9, 8, 7, 6, 5, 4, 3, 2, 1, 0	
				
Quelques explications:
La fonction table.sort(table, comparaison) possède 2 arguments:
Le premier est le nom de la table
Le deuxième argument est une fonction de comparaison qui doit renvoyer une valeur booléenne indiquant si le premier argument doit être avant le deuxième argument dans l'ordre de tri.
En absence du deuxième argument, le tri se fait dans un ordre croissant.

Une fonction qui possède une autre fonction comme argument, ici le tri, est appelée fonction d'ordre supérieur.

Une fonction d'ordre supérieur est un puissant mécanisme de programmation, tout comme l'utilisation des fonctions anonymes en tant qu'argument.

Rappelez-vous que les fonctions d'ordre supérieur n'ont pas de droit particulier, elles sont une simple conséquence de la capacité que possède LUA pour gérer ses fonctions et que les fonctions écrites en LUA, peuvent être stockées dans des variables globales, des variables locales et dans les champs d'une table.


* callback:
Se dit d'une fonction qui est passée en argument à une autre fonction.
logo wxWidgets Le savoir ne vaut que s'il est partagé par tous...
logo-internet_32x32.png Dernière mise à jour, le 20 novembre 2012.
Valid XHTML 1.0 Transitional

wxlualogo
Flèche haut
Flèche gauche
Flèche haut
Flèche droite