Lua
Un article de Wikipédia, l'encyclopédie libre.
![]() |
Cet article fait partie de la série Langages de programmation |
Langages à objets |
4D - C++ - C# - D Delphi - Eiffel - Groovy Java - Python - Ruby Simula - Smalltalk Visual Basic - WinDev |
Langages impératifs |
APL - ASP - Assembleur BASIC - C - Cobol Forth - Fortran - Limbo Logo - Pascal - Perl - PHP |
Langages fonctionnels |
Haskell - ML/OCaml Lisp/Common Lisp Scheme XSLT |
Langages déclaratifs |
Clips - Prolog |
Langages concurrents |
Ada 95 - Erlang |
Langage de balisage |
HTML - SGML - XML S-expressions |
Voir aussi |
Conception - Codage Tests - Optimisations |
Lua est un langage de script libre dont l'interpréteur est conçu dans un but de compacité (95 à 185 Ko pour la version 5.0.2, selon le compilateur utilisé et le système cible). Lua est conçu de manière à pouvoir être embarqué au sein d'une autre application, ce qui permet d'étendre celle-ci. Lua (qui signifie lune en portugais) a été développé par Luiz Henrique de Figueiredo, Roberto Ierusalimschy et Waldemar Celes, membres du groupe de recherche TeCGraf, de l'université de Rio de Janeiro au Brésil.
Lua est écrit en langage C ANSI strict, et de ce fait est compilable sur une grande variété de systèmes. Il est souvent utilisé dans des systèmes embarqués où sa compacité est très appréciée. Il profite de la compatibilité que possède le C avec un grand nombre de langages pour s'intégrer facilement dans la plupart des projets.
Lua a été porté dernièrement sur la console portable de Sony, la PSP. Il est aussi le langage utilisé pour l'interface de World of Warcraft et de nombreux autres jeux. On peut aussi noter qu'une version Playstation 2 est en cours de portage.
Sommaire |
[modifier] Généralités
[modifier] Commentaires
En Lua, les commentaires débutent par --
et finissent à la fin de la ligne. Si la première ligne commence par #! (shebang) elle est aussi traitée comme un commentaire. On peut faire des commentaires multilignes avec la syntaxe --[[ ... ]]
[modifier] Variables
Les variables peuvent contenir nil
(la valeur nulle, vide), un booléen, une chaîne de caractères, un nombre, une table ou une fonction. Il existe aussi d'autres types comme userdata
ou thread
moins souvent rencontrés. Le type userdata
est très pratique, il correspond à un objet C/C++ défini par l'utilisateur : il est donc possible de créer une structure C ou une classe C++, et d'utiliser des objets de ce type dans un script Lua, après avoir attaché à cet objet une métatable qui se charge d'appeler les fonctions de la classe C++. On peut donc imaginer de créer les classes métier de base d'un programme en C, et coder l'application elle-même en Lua, ce qui accélère considérablement son développement (pas de recompilation en cas d'erreur de programmation...).
Par défaut, lorsqu'on déclare une variable, elle est globale à tout l'environnement d'exécution, sauf si elle est précédée du mot-clef local
.
Les chaînes de caractères sont délimitées par des guillemets simples (') ou doubles("), voire la marque de chaîne litérale [[ ... ]]
(multiligne, pas de caractère spécial). L'opérateur de concaténation de chaînes est ..
[modifier] Les fonctions
Les fonctions sont considérées comme des variables. Cela apporte une grande flexibilité : il est par exemple possible de créer des fonctions locales à une autre fonction, de passer une fonction comme paramètre d'une autre fonction (ou comme valeur de retour !) ou de mettre des fonctions dans des tables. Si on affecte nil
à une fonction (eg. print = nil
), la fonction n'existe plus, n'est plus appelable.
Un avantage des fonctions en Lua est qu'elles peuvent prendre un nombre indéfini de paramètres mais surtout elles peuvent retourner plusieurs valeurs de retour.
[modifier] Les tables, métatables
Les tables sont une structure Lua qui permettent de stocker des variables indexées par une clef (comme en PHP par exemple). Les tables servent à beaucoup de choses en Lua, c'est par exemple la structure utilisée pour représenter des pseudo-classes et objets.
Les métatables sont des tables pour lesquelles on a associé une fonction à chaque opérateur de base (+, -, (), [], ...). Ce mécanisme est très proche de la redéfinition des opérateurs en C++. Par exemple, si la variable x contient une table associée à une métatable appropriée, l'appel de fonction x(arguments) sera valide car Lua cherchera alors dans la métatable comment traiter cet appel.
C'est ainsi qu'on peut implémenter l'héritage entre tables. Si un champ n'est pas trouvé lorsqu'il est demandé, Lua cherchera dans la métatable quelle table est parente et demandera à la table parente de fournir l'élément approprié.
[modifier] Exemples
[modifier] Condition
if condition1 then -- instructions executées si la condition 1 est vraie elseif condition2 then -- instructions executées si la condition 2 est vraie et la condition 1 est fausse else -- instructions executées si les deux conditions sont fausses end
[modifier] Boucles
repeat -- code until condition
et
while condition do -- code end
ainsi que
for var = start, end, step do -- code end
ou
for var_1, ..., var_n in explist do -- code end
[modifier] Déclaration de fonctions
function mafonction(arg1, arg2, ...) -- code return résultat1, résultat2 end
-- ou --
mafonction = function (arg1, arg2, ...) -- code return résultat1, résultat2 end
[modifier] Appels de fonction
res1, res2 = mafonction(var)
[modifier] Blocs inconditionnels
Les blocs inconditionnels servent par exemple à déclarer des variables locales à ce bloc :
do local mavariable = "chaîne" -- déclaration de variable, optionnel -- code utilisant mavariable end
[modifier] Déclaration de table
Table à indices numériques croissant (premier indice : 1)
a = { 5, "foo", [[C:\Lua\Lua.exe]], 'bar', 42 }
Table à indices textuels -- les clés ayant la syntaxe d'une variable n'ont pas besoin d'être entre quotes
a = { d = 5, s = "foo", ['chaîne avec espace'] = true }
Table stockant des variables complexes : autres tables, fonctions, références croisées...
fonction = function (a, b) return (a + b) / a * b end t = { b = { -- Fonction comme clé [fonction] = 'Fonction !', -- Index numérique [5] = 42, -- Index chaîne simple (ie. syntaxe d'une variable) ls = [[ Valeur Multiligne ]], -- Index chaîne quelconque [Expression rationnelle] = [[(?:\d{1,3}\.){3}\d{1,3}]], [ [[C:\Lua\Lua.exe]] ] = true, }, -- Stockage d'une fonction f = function () return math.random(100) end, ff = fonction, -- Table comme clé [ { 'a', 'b' } ] = { "aa", "bb" }, } -- Référence dans la table t.reference = t.a t[ { t.a, t.b } ] = t.f
[modifier] Liens externes
- (en) Site officiel de Lua
- (en) Site des utilisateurs de Lua
- (en) Site officiel de Lua porté sur la PSP
- (en) LuaForge, un service d'hébergement pour les projets en rapport avec Lua
- (fr) XtreamLua, La communauté française du LUA.