Lua/Overview/fr
À propos de Lua
Lua est un langage de script qui peut être utilisé pour analyser des données et calculer des expressions. Il formate les résultats compatibles avec la programmation procédurale, la programmation orientée objet, la programmation fonctionnelle, la programmation axée sur les données et la description des données. Toutefois certains scripts Lua peuvent être simplifiés, pour une meilleure compréhension.
Lua permet des structures complexes comprenant des tableaux, des fonctions dynamiques, et des tableaux associatifs où les Indices peuvent être des mots ou des numéros d'index. Il est typé dynamiquement (cela signifie que les variables n'ont pas de types, seules les valeurs en ont), fonctionne en interprétant le bytecode à l'aide d'une machine virtuelle basée sur les registres, et dispose d'une gestion automatique de la mémoire avec un ramasse-miettes générationnel, ce qui le rend idéal pour la configuration, l'écriture de scripts et le prototypage rapide.
Lua est implémenté en tant que bibliothèque, écrit en code C pur, le sous-ensemble commun du C standard et de C++. La distribution Lua inclut un programme hôte appelé Lua, qui utilise la bibliothèque Lua pour fournir un interpréteur complet et autonome utilisable interactivement ou par lots.
Lua est un langage de programmation léger qui se prête particulièrement bien quand il est imbriqué dans d'autres logiciels. Le logiciel utilisé par Wikipédia, appelé MediaWiki, a une extension qui fournit une version de Lua qui peut être utilisé dans des pages Wikipédia. Cette extension s'appelle Scribunto .
Différences entre Lua et Scribunto
Lua est un langage de programmation disponible via la MediaWiki extension Scribunto sur la Wikipedia anglophone. L'extension Scribunto permet d'inclure des langages de script dans MediaWiki. Le code Lua peut maintenant être intégré dans les modèles wiki (ce qui agit comme le client hôte) en utilisant la fonctionnalité {{#invoke:}} de Scribunto. Cette extension prend en charge Lua 5.1 comme depuis juillet 2015 Category:Pages containing potentially dated statements.
Actuellement, le seul langage de script pris en charge est Lua.
Un module Scribunto en lui-même est réellement une fonction importante : il fonctionne de haut en bas et il est censé rendre une valeur.
Il peut renvoyer un tableau de chaînes, une table contenant d'autres tables, ou même une valeur seule.
Habituellement, il renvoie le tableau des fonctions exportées utilisables avec {{#invoke: }}
Avantages d'utiliser les scripts Lua
Des modèles et ParserFunctions ont été introduits pour permettre aux utilisateurs finaux de MediaWiki de reproduire facilement du contenu et de créer des outils en utilisant la logique de base, transformant efficacement le wikicode en un langage de programmation limité.
Néanmoins les modèles complexes peuvent créer des problèmes de performances et des goulots d'étranglement.
Le but de ce projet est de permettre aux utilisateurs finaux de MediaWiki d'utiliser un langage de script propre qui serait plus puissant et plus efficace que la logique correspondante basée sur les fonctions de l'analyseur syntaxique.
Débuter avec Lua sur Wikipedia
Le logiciel utilisé par Wikipedia, appelé MediaWiki, possède une extension qui fournit une version de Lua pouvant être utilisée sur les pages Wikipedia. L'extension s'appelle Scribunto.
Le code source Lua est stocké dans des pages appelées modules.
Le module lui-même doit renvoyer une table Lua contenant des fonctions qui peuvent être appelées via {{#invoke:}}
.
Toute fonction qui n'est pas ajoutée à cette table, qu'elle soit locale ou globale, ne sera pas accessible via {{#invoke:}}
, mais les fonctions globales sont accessibles depuis les autres modules chargés en utilisant la fonction Lua require()
.
Il est généralement de bon ton dans un module de déclarer toutes les fonctions et les variables en local.
Ces modules individuels peuvent être appelés sous le format suivant {{#invoke:<Module name>|<Function name>|(optional) param1 | param2...}}
).
Dans l'exemple ci-dessous, nous travaillerons avec Lua sur Wikipedia en utilisant le bac à sable du module (contenant le code Lua à exécuter) et le bac à sable de l'utilisateur (contenant le texte wiki qui exécute le code et affiche les résultats).
Prérequis
- Créez un compte Wikipedia si vous ne l'avez pas déjà – voir Créer un compte utilisateur
- Après vous être connecté à votre compte, utilisez le lien en haut à droite de votre page qui contenant votre nom d'utilisateur afin de créer votre page utilisateur. Dans la boîte d'édition entrez une phrase mais ne fournissez pas d'informations personnelles. Affichez l'aperçu de vos modifications puis enregistrez-les.
- Utilisez le lien dans le coin supérieur de votre page pour créer votre bac à sable. Ecrivez un texte court qui dit qu'il s'agit de votre bac à sable utilisateur, affichez son aperçu et enregistrez-le. Rappelez-vous que ce que vous écrivez peut être vu par n'importe qui, alors soyez raisonnable !
- Lire au sujet de Scribunto, l'implémentation Lua incluse dans le logiciel Wikimedia : Lua
- Créez un bac à sable vide pour votre module en tant que sous-page de Module:Sandbox. Par exemple si votre nom d'utilisateur est "Gechy", créez votre module sous Module:Sandbox/Gechy/ogechi. Notez que les espaces seront converties en caractères de soulignement '_' dans l'URL de la page que vous pourrez voir dans la barre d'adresse de votre navigateur. Ceci est appelé encodage des URLs.
- Dans le bac à sable de votre module ajoutez une ligne de texte commençant par deux tirets :
--
- Après les deux tirets, entrez votre nom d'utilisateur suivi de
Introduction to Lua in Wikipedia
. En Lua, un texte qui commence par deux tirets est un commentaire. - Enregistrez le bac à sable de votre module.
Exécuter le code Lua sur Wikipedia
Une page de Wikipédia peut appeler un module Lua pour effectuer des calculs, traiter du texte, formater des citations, obtenir des informations à partir de Wikidata et de nombreux autres emplois où il est nécessaire d'utiliser un langage de programmation pour obtenir un résultat.
Un module Lua est référencé dans une page Wikipedia en codant un appel similaire à : {{#invoke:RexxS|carousel}}
- Dans votre bac à sable utilisateur (pas celui du module), laissez une ligne blanche après votre courte note puis entrez ceci :
== Task 1 ==
En encadrant une phrase avec ==, vous créez un titre HTML de niveau 2. Nous pouvons utiliser cela pour fragmenter notre bac à sable utilisateur en sections pour différentes tâches.
- Sur la ligne qui suit, entrez ou copiez
{{#invoke:RexxS|carousel}}
et enregistrez-le.
N'oubliez pas de sauvegarder votre bac à sable utilisateur à chaque fois que cela est demandé.
Vous devriez voir le nom de fichier d'une image JPG. La ligne utilise le module Module:Rexxs. Les modules peuvent contenir plusieurs fonctions et la ligne que vous avez écrite appelle la fonction carousel de ce module.
- Ajoutez une ligne vide dans votre bac à sable utilisateur pour lire
[[File:{{#invoke:RexxS|carousel}} | thumb]]
et enregistrez-le.
Ceci utilise la syntaxe standard pour l'affichage des images Wikipedia.
- Analysez le code présenté sur Module:Rexxs. Essayez de voir comment la fonction retrouve un nom de fichier. Pour apprendre le fonctionnement de Lua, aidez-vous de la documentation http://www.lua.org/manual/5.3/ .
Vous devriez être en mesure de vérifier que les noms de fichier des images renvoyées se trouvent bien dans une liste. En Lua, les listes sont des tableaux. Le tableau est la seule structure de données utilisée et tous les autres types de structures de données, les tableaux, les séquences, les objets, etc. ne sont créés qu'à partir des tableaux.
Dans le module Lua, nous pouvons avoir autant de fonctions que nous voulons; l'identifiant pour les appeler, est le nom de la fonction.
Wikicode | Résultat |
---|---|
{{#invoke:Example|hello}} |
Hello World! |
Dans l'exemple ci-dessus, le module utilisé s'appelle Module:Example et la fonction dont le nom est hello est invoquée; voir un extrait de la fonction hello ci-dessous Module:Example :
local p = {} --Chaque module en Lua de Wikipedia doit commencer par définir une variable contenant ses fonctions accessibles de l'extérieur
--Ces variables peuvent avoir un nom quelconque et contenir des données et des fonctions.
p.hello = function( frame ) --ajouter une fonction à "p"
--ces fonctions sont appelables dans Wikipedia avec la commande #invoke
--"frame" contient les données que Wikipedia passe à cette fonction à l'exécution
-- 'Hello' est un nom de votre choix. Le même nom doit être mentionné lorsque le module est utilisé.
local str = "Hello World!" --Déclarer une variable locale et la mettre à
--"Hello World!".
return str --indique de quitter cette fonction et de passer l'information à Wikipedia dans "str".
end -- fin de la fonction "hello"
return p -- doit rendre p pour que le module soit accessible
Le Module:Example contient jusqu'à 5 fonctions différentes (hello, hello_to, count_fruit, lucky, Name2) qui peuvent être appelées indépendamment en utilisant {{#invoke:}}
.
Concepts Lua
En Lua, il n'existe pas de définition de type dans le langage. Chaque valeur transporte son propre type. Cela signifie que toutes les valeurs peuvent être stockées dans des variables, transmises comme arguments à d'autres fonctions et fournies en résultat. Dans Scribunto six types sont utilisés (sur les huit disponibles dans le langage de programmation Lua).
Nil
Le type nil a une seule valeur : nil dont la propriété principale est d'être différent de toute autre valeur. Souvent il représente l'absence d'une valeur nécessaire.
A la fois nil et false
rendent une condition fausse; ils font partie de l'ensemble des valeurs fausses.
Tout autre valeur rend une condition à true
.
En essayant d'obtenir une variable qui n'existe pas, vous obtenez nil.
Booléen
Le type booléen possède deux valeurs, false
et true
quand il est converti en une chaîne.
Et contrairement à de nombreuses autres langues, seuls false et nil sont équivalents à false
dans la conversion booléenne; le nombre 0 et la chaîne vide équivalents à true
.
Nombre
Le type numérique représente à la fois les nombres entiers et réels (à virgule flottante) et il utilise deux sous-types : entier et flottant. Lua possède des règles explicites quant à l'utilisation des chaque sous-type, mais il les convertit aussi automatiquement à l'exécution.
Dans la conversion d'un entier en flottant, si la valeur entière peut être représentée exactement sous la forme d'un flottant, ceci est le résultat. Dans le cas contraire, la conversion fournit la valeur représentative la plus proche, par valeur supérieure ou inférieure. Ce type de conversion n'échoue jamais.
Dans la conversion d'un flottant en entier, si le flottant peut être représenté exactement sous la forme d'un entier, ceci est le résultat (le flottant est alors un entier et il se trouve dans l'intervalle de représentation des nombres entiers). Si c'est le cas, cette représentation est le résultat. sinon la conversion échoue.
Chaîne de caractères
Le type chaîne représente des séquences non mutables d'octets. Lua reconnaît 8 bits : les chaînes peuvent contenir n'importe quelle valeur sur 8 bits, y compris des zéros inclus ("\0"). Une chaîne est convertie en entier ou en flottant suivant sa syntaxe et les règles du lexer Lua. La chaîne peut aussi avoir des espaces au début et à la fin ainsi qu'un signe.
Fonction
Les fonctions en Lua sont des valeurs de première classe. Ils peuvent être écrits de manière anonyme, passés en argument ou assignés à des variables.
Les fonctions sont créées en utilisant le mot-clé function
et appelées avec des parenthèses.
Le sucre syntaxique (c'est à dire tout ce qui peut faciliter) est disponible pour les fonctions nommées, les fonctions locales, et les fonctions qui agissent en tant que fonction membre dans un tableau.
Tableau
La table Lua implémente les tableaux associatifs c'est à dire des tableaux pouvant être indexés non seulement avec des nombres mais aussi avec n'importe quelle type de valeur (sauf nil).
Les tableaux peuvent contenir des valeurs de tout type (sauf nil).
Pour représenter les enregistrements, Lua utilise le nom du champ comme un index.
Le type de tableau Lua supporte cette représentation en fournissant a.name comme sucre syntaxique pour a[name]
.
Les tableaux sont créés à l'aide d'accolades. Un tableau vide est représenté par {}. Ils stockent un ensemble de paires clés-valeurs. Dans une paire clé-valeur, vous pouvez stocker une valeur avec une clé, et récupérer cette valeur par la suite à l'aide de la clé.
Conversion du type de données
Lua convertira automatiquement les types chaînes et les nombres au format correct pour réaliser les calculs. Cette conversion automatique des types est appelée conversion forcée (coercion). Pour effectuer l'arithmétique Lua sur une chaîne, on convertit d'abord la chaîne en nombre. L'opération rendra une exception si la chaîne ne peut pas être convertie. Voir l'exemple ci-après :
= 10 + "7" -- ajouter un nombre à une chaîne
result = 17 -- renvoyer un nombre
= "John" + 43
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk
[C]: ?
Il n'est pas possible de convertir la chaîne "John" en nombre ce qui génère une exception. De manière équivalente, pour les opérateurs de comparaison, la conversion des données joue un rôle majeur comme le montre l'exemple ci-dessous.
= 100 == "100" -- comparer un nombre et une chaîne
result = False -- sont différents
= 100 ~= "hello" -- un nombre n'est pas égal à une chaîne
result = true --- sont différents
= 100 == tonumber("100") --tonumber convertit la chaîne en un nombre
result = true -- égalité après la conversion
= 100 <= "100"
result = stdin:1: attempt to compare number with string
stack traceback:
stdin:1: in main chunk
[C]: ?
En Lua les opérateurs d'égalité (inégalité) considèrent qu'un nombre est différent de sa représentation sous forme de chaîne (plus généralement, de tout type qui n'est pas numérique) comme le montre l'exemple ci-dessus. Il est déconseillé de compter sur la conversion automatique; définir plutôt un type pour tout calcul impactant les performances.
Opérations de base dans Lua
Fonction print
Nous utiliserons la fonction print() pour imprimer des valeurs ou des calculs sur ces valeurs. Les parenthèses qui entourent les arguments sont importantes et provoqueront une erreur si elles sont omises.
print("hello") --imprimer la chaîne hello.
hello -- résultat
Assignation
Lua permet les assignations multiples. Nous pouvons assigner des chaînes aux variables comme nous le pouvons avec des nombres :
who = "John" -- initialiser la variable who avec la chaîne John
print(who)
John -- résultat de la fonction print
Concaténation
L'opérateur Lua de concaténation de chaîne est désigné par les deux points ('..'). Pour concaténer (joindre) des chaînes, utiliser l'opérateur .. :
print("hello " .. who) -- la variable ''who'' a été attribuée ci-dessus
hello John --résultat
Commentaires
Un commentaire commence par un double tiret (--) n'importe où en dehors d'une chaîne. Les commentaires longs sont souvent utilisés pour désactiver le code temporairement.
Les autres opérations telles que la manipulation des chaînes, les tableaux, les nombres sont développées dans les tutoriels Lua.
Références
- Documentation officielle de Lua
- Manuel Lua
- Extension:Scribunto/Manuel de référence Lua
- User:RexxS Docs — travaux pratiques Lua de Google Code
- Documentation utilisateur Lua
- Exercices Lua sur Exercism