Initiation au Lua avec Scribunto/Autres fonctions standards
Dans les chapitres précédents, nous avons étudié certaines catégories de fonctions. Ces catégories étaient suffisamment grandes pour que nous leur consacrions un chapitre entier. Il nous reste toutefois à étudier d'autres catégories de fonctions qui contiennent peu de fonctions. Nous consacrons donc ici ce chapitre aux fonctions qui appartiennent aux catégories restantes.
Fonctions concernant les tables
[modifier | modifier le wikicode]Les exemples donnés dans ce paragraphe se trouvent dans le Module:Tables.
table.insert
[modifier | modifier le wikicode]La fonction table.insert permet de rajouter un élément dans une table avec clé numérique, mais pas forcément à la fin comme on a l'habitude de le faire. La fonction insert permet d'insérer un élément à une clé déjà existante en décalant tous les objets déjà présents à partir de cette clé. Prenons un exemple pour mieux comprendre.
Des voitures s’apprêtent à faire une course sur un circuit. Supposons les voitures numérotées dans lesquelles se trouvent des conducteurs. Supposons que Natacha arrive en retard et veuille absolument conduire la voiture 3 (déjà occupé) car 3 est son numéro fétiche. On va donc donner la voiture 3 à Natacha. Le conducteur de la 3 ira dans la 4. Le conducteur de la 4 ira dans la 5 et ainsi de suite. Ceci est réalisé grâce à l'instruction table.insert(circuit,3,"Natacha")
Le programme décrivant l'occupation des voitures avant et après l'arrivée de Natacha est le suivant :
local p = {}
local circuit = {"Laurent","Cécile","Alain","Cloé","Amandine"}
function p.insertion()
local reponse = " "
reponse = reponse.."<br><u>voitures avant l'arrivée de Natacha.</u>"
for voiture, conducteur in ipairs(circuit) do
reponse = reponse.."<br>La voiture "..voiture.." est conduite par "..conducteur.."."
end
table.insert(circuit,3,"Natacha")
reponse = reponse.."<br><u>voitures après l'arrivée de Natacha dans la voiture 3.</u>"
for voiture, conducteur in ipairs(circuit) do
reponse = reponse.."<br>La voiture "..voiture.." est conduite par "..conducteur.."."
end
return reponse
end
return p
En tapant {{#invoke:Tables|insertion}}, on obtient :
voitures avant l'arrivée de Natacha.
La voiture 1 est conduite par Laurent.
La voiture 2 est conduite par Cécile.
La voiture 3 est conduite par Alain.
La voiture 4 est conduite par Cloé.
La voiture 5 est conduite par Amandine.
voitures après l'arrivée de Natacha dans la voiture 3.
La voiture 1 est conduite par Laurent.
La voiture 2 est conduite par Cécile.
La voiture 3 est conduite par Natacha.
La voiture 4 est conduite par Alain.
La voiture 5 est conduite par Cloé.
La voiture 6 est conduite par Amandine.
table.remove
[modifier | modifier le wikicode]La fonction table.remove réalise le contraire de ce que faisait la fonction table.insert. Elle retire un élément de la table avec clé numérique et décale les éléments suivants de façon à boucher le trou.
Reprenons l'exemple précédent en supposant, cette fois qu'Alain, le conducteur de la voiture 3, ne se sente pas bien et renonce à prendre le départ. Pour éviter qu’il y ait une discontinuité dans la numérotation des voitures, le conducteur de la voiture 4 va aller dans la 3. Le conducteur de la 5 va aller dans la 4 et ainsi de suite. Ceci est réalisé grâce à l'instruction table.remove(circuit,3). Cette fonction retourne l'élément retiré.
Le programme décrivant l'occupation des voitures avant et après le départ d'Alain est le suivant :
local p = {}
local circuit = {"Laurent","Cécile","Alain","Cloé","Amandine"}
function p.retrait()
local reponse = " "
local souffrant
reponse = reponse.."<br><u>voitures au départ du circuit.</u>"
for voiture, conducteur in ipairs(circuit) do
reponse = reponse.."<br>La voiture "..voiture.." est conduite par "..conducteur.."."
end
souffrant = table.remove(circuit,3)
reponse = reponse.."<br><u>voitures après le départ de "..souffrant.." de la voiture 3.</u>"
for voiture, conducteur in ipairs(circuit) do
reponse = reponse.."<br>La voiture "..voiture.." est conduite par "..conducteur.."."
end
return reponse
end
return p
En tapant {{#invoke:Tables|retrait}}, on obtient :
voitures au départ du circuit.
La voiture 1 est conduite par Laurent.
La voiture 2 est conduite par Cécile.
La voiture 3 est conduite par Alain.
La voiture 4 est conduite par Cloé.
La voiture 5 est conduite par Amandine.
voitures après le départ de Alain de la voiture 3.
La voiture 1 est conduite par Laurent.
La voiture 2 est conduite par Cécile.
La voiture 3 est conduite par Cloé.
La voiture 4 est conduite par Amandine.
table.concat
[modifier | modifier le wikicode]La fonction table.concat permet d'obtenir une chaîne de caractères exposant le contenu (ou une partie du contenu) d'une table. Elle s'utilise sous la forme : table.concat(table, séparateur, début, fin)
Les paramètres séparateur, début et fin sont facultatifs. Si le paramètre séparateur est absent, il n'y aura pas de séparateurs. Si le paramètre début est absent, la concaténation se fera à partir du début de la table. Si le paramètre fin est absent, la concaténation se fera jusqu'à la fin de la table.
Écrivons, en exemple, une fonction qui nous donne les conducteurs des exemples précédents sauf le premier.
local p = {}
local circuit = {"Laurent","Cécile","Alain","Cloé","Amandine"}
function p.conducteurs()
return table.concat( circuit, " et aussi ",2,5)
end
return p
En tapant {{#invoke:Tables|conducteurs}}, on obtient : Cécile et aussi Alain et aussi Cloé et aussi Amandine
table.maxn
[modifier | modifier le wikicode]Retourne le plus grand index numérique positif utilisé dans la table.
local p = {}
local circuit = {"Laurent","Cécile","Alain","Cloé","Amandine"}
function p.sup()
return table.maxn(circuit)
end
return p
En tapant {{#invoke:Tables|sup}}, on obtient : 5
table.sort
[modifier | modifier le wikicode]Permet de trier la table.
local p = {}
local circuit = {"Laurent","Cécile","Alain","Cloé","Amandine"}
function p.trie()
table.sort(circuit)
return "le nouvel ordre est : "..table.concat(circuit,", ")
end
return p
En tapant {{#invoke:Tables|trie}}, on obtient : le nouvel ordre est : Alain, Amandine, Cloé, Cécile, Laurent
Nous voyons que les éléments de la table ont été triés par ordre alphabétique.
Fonctions concernant le système d'exploitation
[modifier | modifier le wikicode]
Les exemples donnés dans ce paragraphe se trouvent dans le Module:Temps.
os.time
[modifier | modifier le wikicode]cette fonction nous ramène un nombre mystérieux à 10 chiffres qui probablement contient, sous forme codé la date et l’heure.
local p = {}
function p.heure()
return "La fonction os.time nous retourne : "..os.time()
end
return p
{{#invoke:Temps|heure}} nous retourne : La fonction os.time nous retourne : 1729918360
os.difftime
[modifier | modifier le wikicode]Cette fonction semble être destinée à faire la différence entre deux temps donnée sous un format particulier. En tout cas, elle fait la différence entre deux nombres.
local p = {}
function p.delais()
return "La fonction os.difftime nous retourne : "..os.difftime(74,3)
end
return p
{{#invoke:Temps|delais}} nous retourne : La fonction os.difftime nous retourne : 71
os.clock
[modifier | modifier le wikicode]Cette fonction donne le temps CPU d'exécution d'un programme en seconde. Cette fonction permet donc de mesurer le temps qui s'écoule entre deux parties d'un programme. Pour des exemples d'application voir, dans le chapitre sur la gestion de l'environnement, le paragraphe sur la vitesse d'exécution d'un programme. Voir aussi l'exercice 7-1.
Le temps CPU démarre au moment où commence à s'afficher la page dans laquelle se trouve le module contenant la fonction os.clock et pas au moment où est lancé le module. Par conséquent, si dans une page, on met plusieurs modules utilisant la fonction os.clock, on observera un temps d'autant plus grand que le module est près du bas de la page.
Le temps CPU est donné en seconde et est le plus souvent compris entre 2 et 20 millisecondes.
Si l’on veut chronométrer le temps d'exécution d'une partie d'un programme, on est obligé de mettre l'instruction avant et après la partie à chronométrer et de faire la différence entre les deux temps obtenus. On obtient alors un temps généralement très inférieur à la milliseconde.
Compte tenu du fait que nos programmes s'exécutent sur un système multitâche, le temps donné par la fonction os.clock est très approximatif et sera différent d'une exécution à l'autre. |
Si dessous nous présentons un exemple donnant le temps écoulé, depuis le début de l’affichage de cette page, en millisecondes :
local p = {}
function p.horloge()
local reponse = ""
local temps = os.clock()
reponse = reponse.. "<br>La fonction os.clock nous retourne : "..temps
temps = temps*1000
reponse = reponse.."<br>Ce qui signifie que "..temps.." millisecondes se sont écoulées depuis le début de l’affichage de cette page."
return reponse
end
return p
{{#invoke:Temps|horloge}} nous donne :
La fonction os.clock nous retourne : 0.006
Ce qui signifie que 6 millisecondes se sont écoulées depuis le début de l’affichage de cette page.
os.date
[modifier | modifier le wikicode]Cette fonction permet de donner la date et l’heure sous un format choisi. Elle peut fournir une chaîne de caractère ou remplir un tableau avec les différents éléments de la date et de l’heure.
local p = {}
function p.date()
return "La fonction os.date nous retourne : "..os.date()
end
return p
{{#invoke:Temps|date}} nous retourne : La fonction os.date nous retourne : Sat Oct 26 04:52:40 2024
Fonctions concernant la librairie Scribunto
[modifier | modifier le wikicode]
Les exemples donnés dans ce paragraphe se trouvent dans le Module:Scribunto
mw.clone
[modifier | modifier le wikicode]Nous savons que les tables et les fonctions sont affectées par référence. Si A est une table, l'instruction B = A affectera à B l'adresse de la table A et toutes les modifications effectuées sur A sembleront se répercuter sur B. Pour réaliser une véritable recopie du contenu de la table A dans la table B, on utilisera la fonction préprogrammée mw.clone en écrivant B = mw.clone(A). Cette fois, les tables A et B seront totalement indépendantes bien que contenant les mêmes objets juste après l'affectation.
Dans l'exemple ci-dessous, nous vérifions ce que nous venons de dire en créant une table A que nous affectons à une table B grâce à B = A et à une table C grâce à C = mw.clone(A). Nous modifions ensuite A et nous vérifions que cette modification s'est bien répercutée sur B mais pas sur C.
local p = {}
function p.duplique()
local A = {"truc", "machin", "chose"}
local B = A
local C = mw.clone(A)
A[2] = "bidule"
return "B[2] contient "..B[2].." et C[2] contient "..C[2]
end
return p
{{#invoke:Scribunto|duplique}} nous donne : B[2] contient bidule et C[2] contient machin
mw.loadData
[modifier | modifier le wikicode]Cette fonction permet de charger une table (ou plusieurs) se trouvant dans un autre module. Cette table contient en général un grand nombre de données. Plusieurs raisons justifient le fait que cette table soit écrite dans un autre module :
- Elle est susceptible d’être utilisée par plusieurs modules.
- Cette table n'est chargée qu'une seule fois par page, même si celle-ci utilise plusieurs commandes #invoke, ce qui entraîne une économie de temps.
Certaines restrictions doivent être respectées :
- On ne peut pas charger autre chose qu'une table.
- La table que l’on charge ne doit pas contenir de fonctions.
- Les fonctions pairs et ipairs fonctionnent sur la table retournée. Le fonctionnement des autres fonctions spécialisées dans les tables n’est pas garanti.
Dans l'exemple ci-dessous, la fonction codehex permet de convertir un nom de couleur (de la page Liste de couleurs) en son code hexadécimal qu'elle retourne.
La fonction mw.loadData de l'exemple ci-dessous charge une table se trouvant dans le Module:Nomcouleur. Dans le Module:Nomcouleur, la table chargée se nomme nuancier. On remarquera, en fin de module, l'instruction return nuancier pour que la table puisse être chargée par la fonction mw.loadData à partir d'un autre module.
local p = {}
function p.codehex(frame)
local code = mw.loadData("Module:Nomcouleur")
local couleur = frame.args[1]
return "Le code hexadécimal correspondant à la couleur "..couleur.." est "..code[couleur]
end
return p
Nous voyons, dans l'exemple ci-dessus, que la fonction mw.loadData attend un argument sous forme de chaîne de caractères. Nous lui avons donc donné le nom du module contenant la table à charger, à savoir "Module:Nomcouleur", sans oublier les guillemets et le mot module.
{{#invoke:Scribunto|codehex|caca d'oie}} nous retourne : Le code hexadécimal correspondant à la couleur caca d'oie est cdcd0d
Nota : Si l’on souhaite charger plusieurs tables s'appelant, par exemple, A, B, C à l'aide de la fonction mw.loadData, il faut que dans le module appelé, il y ait l'instruction return {A, B, C}. En fait, on retourne une table de tables.
mw.allToString
[modifier | modifier le wikicode]La fonction mw.allTostring convertit en chaînes de caractères tous ses arguments et concatène les chaînes de caractères obtenues en les séparant par une tabulation. Dans l'exemple, ci-dessous, nous convertissons et concaténons des arguments de types différents : Le nombre 2, la chaîne "mouche", le type nil et le booléen true.
local p = {}
function p.converti()
return mw.allToString(2,"Mouche",nil,true)
end
return p
{{#invoke:Scribunto|converti}} nous retourne : 2 Mouche nil true
Nous vérifierons en exercice qu’il y a bien une tabulation comme séparateur.
mw.getCurrentFrame
[modifier | modifier le wikicode]Cette fonction retourne l’objet frame courant. Elle permet donc, par exemple, une recopie de l’objet frame actuel. Dans l'exemple qui suit, l’objet frame a été recopié dans l’objet frami qui peut s'utiliser comme l’objet frame. Un des avantages est que l’utilisation du nouvel objet sera plus rapide car ne nécessitant plus un appel extérieur au programme.
En réalité, l'explication que nous venons de donner est très fragmentaire car nécessitant des éléments que nous n'avons pas encore étudiés. Nous reviendrons donc sur l'étude de cette fonction dans le chapitre consacré à l’objet frame pour essayer d’en donner une explication plus complète.
Pour le moment, nous nous contenterons de l'exemple suivant ou l’objet frame est recopié dans l’objet frami. On visualise ensuite le contenu de l’objet frami comme on le ferait pour l’objet frame.
local p = {}
function p.courant(frame)
frami = mw.getCurrentFrame()
reponse = ""
for i = 1,5 do
reponse = reponse.."<br />à la clé "..i..", on trouve : "..frami.args[i]
end
return reponse
end
return p
{{#invoke:Scribunto|courant|Marmite|17|Tuile|5|Maison}} nous retourne :
à la clé 1, on trouve : Marmite
à la clé 2, on trouve : 17
à la clé 3, on trouve : Tuile
à la clé 4, on trouve : 5
à la clé 5, on trouve : Maison
mw.incrementExpensiveFunctionCount
[modifier | modifier le wikicode]
mw.log
[modifier | modifier le wikicode]
Fonctions concernant le chargement (Librairie Package)
[modifier | modifier le wikicode]
Les exemples donnés dans ce paragraphe se trouvent dans le Module:Package
require
[modifier | modifier le wikicode]Cette fonction sera étudiée dans le chapitre sur la gestion de l'environnement.
package.loaders
[modifier | modifier le wikicode]
package.preload
[modifier | modifier le wikicode]
package.seeall
[modifier | modifier le wikicode]