如日中天的意思是什么| 什么的李子| 牙疼吃什么菜降火最快| 吃什么治肝病| 不讲武德什么意思| 手脚麻木是什么原因| 苦瓜汤为什么要放黄豆| 慢性胃炎可以吃什么水果| 看得什么| 孕妇吃什么是补铁的| 小腹右边疼是什么原因| 蒸鱼用什么鱼| 彼岸花代表什么星座| 聪明的近义词是什么| 狐臭应该挂什么科| 上火了吃什么水果降火最快| 富态是什么意思| vans是什么牌子| 吃什么补肾益精| 总蛋白低是什么意思| 爱马仕为什么要配货| 有福是什么意思| 什么叫假性发烧| 前白蛋白高是什么意思| 检查怀孕要做什么检查| 为老不尊是什么意思| 洋葱什么时候收获| 宸字五行属什么| 活性炭是什么东西| 大学生入伍有什么好处| 无痕是什么意思| 茶色是什么颜色| 腺体增生是什么意思| 讲解是什么意思| 守护者是什么意思| 落花生为什么叫落花生| 香五行属什么| 滴滴什么意思网络用语| 吃辣椒过敏是什么症状| 喜大普奔什么意思| 什么人不能吃芒果| 黑天鹅是什么意思| 骨科是什么梗| 望穿秋水是什么意思| 硼砂是干什么用的| 什么颜色属金| 短杆菌是什么意思| 试管进周期是什么意思| 92年属猴的是什么命| 脑梗什么症状| 转氨酶和转移酶有什么区别| 减肥期间可以吃什么| 七月七是什么节日| 七月四号是什么星座| 积液是什么原因造成的怎么治疗| 龟头有红点用什么药| 胃疼的人吃什么最养胃| 平坦的反义词是什么| 硫酸亚铁适合浇什么花| 蒙古族不吃什么肉| 择日什么意思| 软件测试需要学什么| 心梗是什么原因引起的| 产前筛查是检查什么| 苦瓜泡水喝有什么功效| 男性泌尿道感染吃什么药| 9月13日是什么星座| 督邮相当于现在什么官| 食客是什么意思| 什么终于什么造句| 1984年属什么| 男子精少吃什么药可以生精| 羊水偏多对胎儿有什么影响| ad是什么缩写| 职业测试你适合什么工作| 红小豆和赤小豆有什么区别| 世界上最硬的东西是什么| 月经后一周又出血是什么原因| 吃什么白头发变黑| 鼻子有痣代表什么| 经常反义词是什么| 属羊女和什么属相最配| 胃不好吃什么养胃水果| o.o什么意思| erke是什么牌子| 吃什么可以增强记忆力| 凌空什么| 乐的五行属性是什么| 肝胃郁热吃什么中成药| 胃食管反流病是什么原因造成的| 薄荷泡水喝有什么功效| rue是什么意思| 梦见老公不理我是什么意思| 蒙脱石散是什么药| 排卵期和排卵日有什么区别| 馕是什么意思| 一什么扇子| 体检需要注意什么| 什么西瓜最好吃| 尿赤是什么意思| 10月底是什么星座| 秋天能干什么| 长期便秘吃什么药| 坐班什么意思| 心性是什么意思| 挂失补办身份证需要什么| 天梭表什么档次| 润肠通便吃什么药| 检查眼睛挂什么科| 伪君子是什么意思| 肠炎吃什么消炎药| 盘核桃有什么好处| 玻色因是什么| 一什么杨桃| 钙片什么时候吃最好吸收| 透明质酸钠是什么东西| 鱼腥草长什么样| 关节炎看什么科| 什么叫易经| 腹股沟淋巴结肿大是什么原因| 戒指戴左手中指是什么意思| 四季春是什么茶| 新疆有什么烟| cm什么单位| 吃什么通便效果最好最快| 手指变形是什么原因| 双肺斑索是什么意思| 年检是什么意思| 什么河水| 散文是什么意思| cps是什么单位| 5月31号什么星座| bf是什么| 七月十五有什么禁忌| 红色加绿色是什么颜色| 蔓越莓对女性妇科有什么好处| 银杏叶片治什么病| 海藻是什么植物| 59是什么意思| neg是什么意思| 女人性冷淡用什么药| 萎缩性胃炎吃什么药效果好| 血压低头疼是什么原因| 鼻涕由清变黄说明什么| 血小板高是什么引起的| 别出心裁的裁是什么意思| 迎字五行属什么| 梦见很多苍蝇是什么意思| 小孩喉咙发炎吃什么药好| 金玉良缘是什么生肖| 血口喷人是什么意思| 狗狗体内驱虫用什么药最好| 排异反应是什么意思| 梦到被雷劈是什么意思| 吹毛求疵什么意思| 骶椎隐裂是什么意思| 厘米为什么叫公分| 马齿苋与什么食物相克| 胆囊结石是什么症状| 太多的借口太多的理由是什么歌| 9月9号是什么星座| 三月十九是什么星座| 女人纵欲过度会有什么症状| 大马士革是什么意思| 阴到炎用什么药好得快| 英雄难过美人关是什么生肖| 拜观音菩萨有什么讲究| 公费医疗什么意思| 屁股痛挂什么科| 此是什么意思| 物色什么意思| 责任是什么生肖| 生物膜是什么| 容易水肿是什么原因| s.m是什么意思| 大暑吃什么| 下眼皮肿是什么原因| 间作套种是什么意思| 球蛋白偏高是什么意思| 辛辣是什么意思| 皮肤起小水泡很痒是什么原因| 郎才女貌是什么意思| 内膜有炎症什么症状| 黑眼圈看什么科| 脑供血不足做什么检查| 水瓶女喜欢什么样的男生| 扎西德勒什么意思| 代价是什么意思| 1993属什么| 40不惑什么意思| 痤疮涂什么药膏| 四不像长什么样| 粘纤是什么材质| 有何特长一般填什么好| 胃不好吃什么水果最好| 野生型是什么意思| 优雅知性是什么意思| 嘴苦是什么原因| 白龙马叫什么名字| 蜂王浆是什么东西| 肤如凝脂是什么意思| 梦见自己在洗澡是什么意思| 清酒和白酒有什么区别| 舌苔白厚吃什么药见效快| 什么大叫| 柠檬泡水喝有什么好处| 脑梗长期吃什么药好| 椎管狭窄吃什么药| 什么能养肝| 胸闷是什么病的前兆| 法国货币叫什么| 双肺门不大是什么意思| 阴吹是什么| 木薯淀粉是什么粉| 什么是| 什么原因引起静脉曲张| 榨菜的原料菜叫什么| 西兰花炒什么好吃| 公主切适合什么脸型| 11月17是什么星座| 小腿抽筋是什么原因引起的| jz是什么意思| 肚子发胀是什么原因| 头胀是什么原因导致的| 孕吐什么时候出现| 长智齿是什么原因引起的| 续航是什么意思| 做梦怀孕了是什么意思| 一味是什么意思| b族维生素是什么意思| 冷藏是什么意思| 左侧附件区囊性占位是什么意思| 迪奥是什么| 苦瓜炒什么好吃| 北豆腐是什么| 40不惑什么意思| 计数是什么意思| 女性脂肪率偏高说明什么| mango是什么意思| 芝士和奶酪有什么区别| 兔日冲鸡什么意思| 头脑胀痛什么原因| 为什么腿会抽筋| 姜汁可乐有什么功效与作用| 因材施教什么意思| 胆红素升高是什么原因| 阑尾炎在什么位置| 心绞痛是什么感觉| 玻璃是什么做的| 每天喝一杯豆浆有什么好处| 1988属什么生肖| 睾丸疼痛挂什么科| 把妹是什么意思| 维生素b6治什么病| 来月经前有褐色分泌物是什么原因| 每天尿都是黄的是什么原因| 扁桃体发炎有什么症状| 看破不说破什么意思| 羊毛疔是什么病| 眼镜轴位是什么| 突然视力模糊是什么原因引起的| 301医院院长什么级别| 天蝎女和什么星座最配| karen是什么意思| 百度Aller au contenu

辣椒蟹吃什么

Un article de Wikipédia, l'encyclopédie libre.

Lua
Logo.

Date de première version 1993
Paradigme Multi-paradigme : procédural, orienté objet à prototype et fonctionnel
Auteur Luiz Henrique de Figueiredo, Roberto Ierusalimschy et Waldemar Celes
Dernière version 5.4.8 ()[1]Voir et modifier les données sur Wikidata
Typage dynamique, faible
Influencé par BASIC, C, C++
A influencé Micro Lua DS
Implémentations Lua, LuaJIT, LLVM-Lua, LuaCLR, Nua, Lua Alchemy, MicroLua,

Mochalua, Jill, luaj, LuaRT

écrit en CVoir et modifier les données sur Wikidata
Système d'exploitation Multiplate-forme
Licence Licence MIT
Site web lua.org
Extension de fichier lua, luna, lunaire et anairVoir et modifier les données sur Wikidata

Lua est un langage de script libre, réflexif et impératif. Il intègre un ramasse-miettes, et il est con?u de manière à pouvoir être embarqué dans d'autres applications pour les étendre.

Lua (du portugais : Lua [?lu.?], au Brésil : [?lu.a], signifiant ? Lune ?[2]), a été développé en 1993 par Luiz Henrique de Figueiredo, Roberto Ierusalimschy (en) et Waldemar Celes, membres du groupe de recherche TeCGraf, de l'université pontificale catholique de Rio de Janeiro au Brésil.

L'interpréteur Lua est écrit en langage C ANSI strict, ce qui le rend compilable sur beaucoup de systèmes. Il est aussi très compact, la version 5.0.2 n'occupant que 95 ko à 185 ko selon le compilateur utilisé et le système cible. L’existence d’interfaces entre C et de nombreux langages facilite l’intégration de Lua dans la plupart des projets.

Sa compacité et son extensibilité le font particulièrement apprécier pour l'embarqué, le développement réseau et les jeux vidéo.

Généralités

[modifier | modifier le code]

Commentaires

[modifier | modifier le code]

En Lua, les commentaires débutent par -- et finissent à la fin de la ligne, comme en Ada. Si la première ligne commence par #! (shebang) elle est aussi traitée comme un commentaire. Les commentaires multilignes sont également disponibles avec la syntaxe

--[[...]]

Une variable peut contenir un booléen, une cha?ne de caractères, un nombre (pas de différence entre entier et flottant), une table ou une fonction. Il existe aussi d'autres types comme userdata ou thread, moins souvent rencontrés. Le type userdata 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 C/C++ appropriées. On pourrait donc imaginer, par exemple, 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érerait son développement grace aux outils de haut niveau fournis par le langage.

Une variable non définie a la valeur nil. Affecter nil à une variable revient à la supprimer.

En interne on peut aussi rencontrer des proto, une sorte de prototype de fonction: le bytecode de cette fonction est chargé mais ce dernier n'a pas encore été exécuté. On rencontre les proto quand un fichier est chargé (compilé) mais pas exécuté ou bien avec des closures.

Par défaut, une variable déclarée est globale à tout l'environnement d'exécution, sauf si elle est précédée du mot-clef local.

Les cha?nes

[modifier | modifier le code]

Les cha?nes de caractères sont délimitées par des guillemets simples (') ou doubles ("), voire par des délimiteurs littéraux [[ ?de niveau n? où n est un certain nombre de signes =. Une cha?ne délimitée ainsi ne s’arrête qu’au délimiteur fermant de même niveau.

a = "a\tbc"        -- Traduit \t en tabulation
b = 'a\tbc"\''     -- Traduit \t en tabulation et \' en guillemet littéral.
c = [[...]]        -- Multiligne, n’interprète aucune séquence \
d = [=[ ... ]=]    -- Multiligne, peut contenir des [[, des -- etc.
e = [==[ ... ]==]  -- Multiligne, peut contenir des [=[, des [[, des --, etc.

L'opérateur de concaténation de cha?nes se représente par deux points (..).

Les fonctions

[modifier | modifier le code]

Les fonctions sont considérées comme des variables. On peut donc en créer dans d'autres fonctions, en passer comme paramètre ou comme valeur de retour d'une autre fonction, ou en mettre comme clé ou comme valeur dans une table.

En Lua, une fonction peut recevoir un nombre quelconque de paramètres, et renvoyer un nombre quelconque de valeurs.

Déclarer une fonction

[modifier | modifier le code]
function mafonction(arg1, arg2, ...)
 -- code
 return résultat1, résultat2
end

ou

mafonction = function (arg1, arg2, ...)
 -- code
 return résultat1, résultat2
end

Le return doit être la dernière instruction avant end. Si nécessaire, on le met dans un bloc inconditionnel.

Appeler une fonction

[modifier | modifier le code]

Les paramètres non-précisés à l’appel sont considérés comme nil. Les valeurs renvoyées en trop sont ignorées.

res1, res2 = mafonction(var)

Les tables, métatables

[modifier | modifier le code]

En Lua, la structure stocke des valeurs indexées par une clé (comme en PHP par exemple). C’est la structure centrale du langage pour représenter tous les objets complexes.

Index et valeurs

[modifier | modifier le code]

Une table peut, entre autres, être utilisée comme :

  • Une liste (par exemple la syntaxe {a,b,c,…} crée une liste débutant à l’index 1). L’opérateur # donne alors la longueur de la liste.
  • Une hashtable (pouvant faire office de structure), qui peut prendre en clé et en valeur tout type de variable (sauf nil).

Les index et les valeurs peuvent être de tout type (l’opérateur # fonctionne toujours mais n’a vraiment de sens que pour les listes)

Par convention, on parcourt une liste avec l'itérateur ipairs et une hashtable avec l'itérateur pairs.

La clé nil est interdite. Affecter nil à un index est permis mais revient à le supprimer. Ainsi a={nil,"x",nil,"y"} équivaut à a={[2]="x",[4]="y"}. L’opérateur de longueur # n’a alors plus de sens, l’itérateur pairs saute les nil, et l’itérateur ipairs s’arrête au premier nil.

Métatables et objets

[modifier | modifier le code]

Les tables facilitent la programmation dans un style objet, notamment grace à deux sucres syntaxiques:

  • objet.clef équivaut à objet["clef"]
  • objet:f() passe à objet.f() un argument caché self=objet

Quant aux métatables, introduites [3] dans Lua 2.1, ce sont des tables que l’on associe à un objet, pour introduire une sorte d’héritage. En effet, si un objet x est associé à la métatable m, et si x[c] n’existe pas, Lua cherche m[c] à la place.

Les métatables permettent également une sorte de surcharge des opérateurs, car Lua y cherche les fonctions __add(), __sub(), __call(), __index() … pour exécuter les opérations +, -, (), []….

L’objet Vector ci-dessous illustre ces notions avec un constructeur, une méthode, et deux opérateurs redéfinis:

local Vector = {}
Vector.__index = Vector -- Où chercher les index absents

function Vector:new(x, y, z)    -- Constructeur
  -- Le ":" passe "self" en premier, qui référence "Vector"
  return setmetatable({x = x, y = y, z = z}, self)
end

function Vector:magnitude()     -- Exemple de méthode
  return math.sqrt(self.x^2 + self.y^2 + self.z^2) -- "self" est passé grace à ":"
end

function Vector.__add(a,b)  -- Définit "+"
  return Vector:new(a.x+b.x, a.y+b.y,a.z+b.z)
end

function Vector.__unm(a)    -- Définit la négation "-"
  return Vector:new(-a.x,-a.y,-a.z)
end

local v = Vector:new(0, 1, 0) -- Crée un vector
print(v:magnitude())          -- Appel de méthode (sortie: 1)
print(v.x, v.y, v.z)          -- Accès aux membres (sortie: 0 1 0)
w = -(v + v)                  -- + et - définis par __add() et __unm()
print(w.x,w.y,w.z)            -- Résultat (sortie: 0 -2 0)

Déclaration de table

[modifier | modifier le code]

Pour créer une table à indices numériques consécutifs (démarrant à 1):

a = { 5, "foo", [[C:\Lua\Lua.exe]], 'bar', 42 }

On peut donner explicitement les indices de la table à créer, entre crochets. Les indices cha?nes semblables à un nom de variable peuvent se passer de guillemets et de crochets :

a = { d = 5, [12] = "foo", ['cha?ne avec espace'] = true } -- comme ["d"]=5

Dans une assignation, la valeur est copiée si c’est un nombre, une cha?ne ou un booléen. Sinon seule la référence est copiée. En particulier, si la variable a est une table et si on assigne a à la variable b, alors toute modification dans la table a est visible dans b, et vice-versa :

local a = {1,"b",3}
local b = a
a.foo = "bar"
print(b.foo) -- bar
-- b et a ont la même référence

L’exemple qui suit est une table stockant des variables complexes : autres tables, fonctions, références croisées…

De même que ci-dessus, si un indice n’est ni un nombre, ni une cha?ne de caractères, ni un booléen, c’est une référence vers la variable concernée :

 fonction = function (a, b) return (a + b) / a * b end
t =
{
	b =
	{
		-- Fonction comme clé
		[fonction] = 'Fonction !', -- la référence à fonction sert de clé
		[5] = 42,                  -- Index numérique
		-- Index cha?ne simple (c.-à-d. la 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,
	},
	f = function () return math.random(100) end, -- clé "f" référen?ant une fonction anonyme.
	ff = fonction, -- clé "ff" référen?ant la fonction globale "fonction"
	-- Référence de table anonyme comme clé: valeur difficilement accessible
	[ { 'a', 'b' } ] = { "aa", "bb" }, -- (i)
}
-- Référence dans la table
t.self = t -- Référence à soi-même
print(t[ { 'a','b'} ]) -- nil car la référence de la nouvelle table { 'a','b' } 
                       -- n'est pas celle de la table { 'a','b' } qui sert de clé en (i)

Boucles, blocs et conditions

[modifier | modifier le code]

La structure if ... then ... elseif ... else ... end est semblable à celle de la plupart des langages

if condition1 and condition2 then
 -- si les conditions 1 et 2 sont vraies
elseif condition1 then
 -- si la condition 1 est vraie et la condition 2 est fausse
elseif condition2 then
 -- si la condition 2 est vraie et la condition 1 est fausse
else
 -- si les deux conditions sont fausses
end

Les opérateurs logiques sont and, or et not.

Les booléens sont true et false, mais les expressions conditionnelles concernent tous les types: une condition est fausse si elle vaut nil ou false, et vraie sinon.

for i,v in ipairs({true, false, 1, "", "0", 0, "true", "false"}) do
  if (v) then print(type(v), v, " est vrai") else print(type(v), v, " est faux") end
  -- boolean true     est vrai
  -- boolean false    est faux
  -- number  1        est vrai
  -- string           est vrai -- Pas comme dans awk
  -- string  0        est vrai --
  -- number  0        est vrai -- Eh oui! pas comme en C
  -- string  true     est vrai
  -- string  false    est vrai -- "false" est une string, pas le booléen false
end

Les opérateurs logiques and et or appliquent une logique de "court-circuit", en renvoyant le premier de leurs opérandes qui suffit à savoir si la formule est vraie ou fausse.

-- Illustration du court-circuit pour ?and? et ?or?
print("un" or "deux" or "trois") -- "un" : ?or? arrête au premier terme vrai et le renvoie
print(nil or false or "dernier") -- "dernier" ... sinon il donne le dernier terme.
print ("un" and nil and "trois") -- "nil" : ?and? arrête au premier terme faux et le renvoie
print ("un" and "deux" and "trois") -- "trois" : ... sinon il donne le dernier terme.
-- Avec des booléens cette logique équivaut aux formules classiques
print(false or true or false)   -- true
print(true and true and false)  -- false

Les structures while et repeat rebouclent tant qu’une condition est vraie. La boucle repeat exécute au moins une fois son corps car elle teste sa condition à la fin.

repeat
 -- code
until condition
while condition do
 -- code
end

Une boucle for affecte successivement des valeurs données par un départ, une arrivée et un incrément, ou par un énumérateur.

for var = start, valend, step do
 -- code
end
for var_1, ..., var_n in explist do
 -- code
 if condition_arret then
     -- autre code
     break -- doit toujours être suivi d’un "end"
 end
 -- code
end

Le dernier exemple montre une instruction break pour quitter la boucle. Elle doit toujours figurer avant un end, ce qui demande parfois de créer un bloc inconditionnel.

Blocs inconditionnels

[modifier | modifier le code]

Les blocs inconditionnels servent par exemple à limiter la visibilité des variables locales :

do
 local mavariable = "cha?ne" -- déclaration de variable, optionnel
 -- code utilisant mavariable
end

Les fonctions standard

[modifier | modifier le code]

Les fonctions mathématiques

[modifier | modifier le code]

La valeur math.pi est le nombre pi.

print(math.pi) --> Affiche dans la console la valeur de pi (3.1415926535898)

La fonction math.min(liste) retourne le plus petit nombre contenu dans une liste

print(math.min(6, 4, 2, 9, 1)) --> Affiche 1 dans la console étant donné que 1 est le plus petit nombre de la liste.

La fonction math.max(liste) retourne le plus grand nombre contenu dans une liste

print(math.max(4, 6, 7, 9, 1)) --> Affiche 9 dans la console étant donné que ce nombre est le plus grand de sa liste.

La fonction math.floor(x) retourne la partie entière de x.

print(math.floor(1.5)) --> Retourne dans la console le nombre 1
print(math.floor(1.5 + 0.5)) --> Retourne dans la console le nombre 2

La fonction math.abs(x) retourne la valeur absolue de x.

print(math.abs(-100)) --> Retourne dans la console le nombre 100.

La fonction math.pow(x, y) retourne x à la puissance de y. On peut aussi utiliser l'expression x^y

print(math.pow(6, 8)) --> Retourne dans la console le nombre 1679616.
-- On peut également utiliser:
print(6^8)

La fonction math.random(x, y) retourne un nombre aléatoire entre la valeur x et la valeur y.

local x = 1
local y = 10

print(math.random(x, y)) --> Retourne dans la console un nombre entier aléatoire entre 1 et 10.

La fonction math.sqrt(x) retourne la racine carrée de x.

local x = 6
print(math.sqrt(x)) --> Retourne la racine carrée de x(6) donc 2.4494897427832.

Les fonctions os

[modifier | modifier le code]

La fonction os.time() retourne le nombre de secondes entre le à 00:00 et la seconde à laquelle vous appelez la fonction.

print(os.time())

La fonction os.date() retourne le jour, le mois, le numéro du mois, l'heure, les minutes, les secondes et l'année à laquelle vous êtes quand vous appelez cette "fonction"

print(os.date()) --> Retourne Thu Jul 1 14:52:59 2021

La fonction os.clock() retourne le temps écoulé en seconde depuis que Lua a été lancé.

print(os.clock()) --> Retourne dans la console 853312.913685

La fonction type

[modifier | modifier le code]

La fonction type(x) donne le type de x sous forme de cha?ne.

local a = "Bonjour"
local b = 5
local c = true
local d

print(type(a)) --> Affiche "string" car la variable est de type string.
print(type(b)) --> Affiche "number" car la variable est de type number.
print(type(c)) --> Affiche "boolean" car la variable est une valeur booléene
print(type(print)) --> Affiche "function" car print est une fonction.
print(type(d)) --> Affiche "nil" car la variable d ne contient pas de valeur.

Les fonctions table

[modifier | modifier le code]

En lua, il existe 9 fonctions table.

La fonction table.insert(x, y, z) insère une valeur y dans un tableau x. On peut lui indiquer la position d’insertion avec un argument z. Si z n'est pas donné, la valeur est mise en dernière position de la table.

local tableau = {"je", "suis", "un", "utilisateur", "du"}
table.insert(tableau, "wiki") --> Insert dans la variable tableau enla valeur wiki. Le troisième argument pour donner la position n'est pas donné donc la valeur se positionnera en dernière place du tableau.

La fonction table.remove(x, y) retire du tableau x la valeur qui se trouve en position y.

local tableau = {"je", "suis", "un", "faux", "utilisateur"}

table.remove(tableau, 4) --> Retire la valeur "faux" du tableau qui était en {{4e|position}}.
-- Il faut conna?tre la position de la valeur à retirer. Sinon, on peut utiliser pairs() dans une boucle.

La fonction table.sort(x) permet de trier et modifier la position des éléments du tableau x.

local tableau = {6, 4, 5, 3, 2, 1}
table.sort(tableau) --> Va venir trier les valeurs du tableau et le modifier en {1, 2, 3, 4, 5, 6}

La fonction table.concat(x, y) concatène les valeurs d'un tableau pour former une chaine de caractères. Le y, facultatif, sert à séparer les valeurs.

local tableau = {"un", "renard", "caché", "dans", 1, "arbre"}
local concatTableau = table.concat(tableau)

print(concatTableau) --> Retourne dans la console la valeur unrenardcachédans1arbre

Voici un exemple d’utilisation du séparateur y:.

local tableau = {"un", "renard", "caché", "dans", 1, "arbre"}
local concatTableau = table.concat(tableau, " | ")

print(concatTableau) --> affiche: un | renard | caché | dans | 1 | arbre. L'argument " | " a été ajouté entre chaque valeur transformée.

Les fonction table.foreach(x, z) et table.foreachi(x, y) sont obsolètes depuis la version 5.1 de lua et doivent être remplacées par pairs() et ipairs(). Voir ci-dessous. La fonction table.getn(x) donne la taille d'un tableau x.

local tableau = {"un", "renard", "gentil"}
local longueur = table.getn(tableau) -- à remplacer par l’opérateur #tableau depuis lua 5.1

print(longueur) --> Retourne dans la console la longueur du tableau "tableau" donc 3.

Les fonctions strings

[modifier | modifier le code]

Les fonctions ?string.?, au nombre de 15, opèrent sur les variables de type string.

Le string.find(x, y) recherche des caractères y dans le string x. Il renvoie nil si rien n’est trouvé. Sinon il indique à partir de quel emplacement les caractères recherchés ont été trouvés.

local variable = "Bonjour, je m'appelle Lua."
local find = string.find(variable, "our")

if find then -- Si find ne vaut pas nil, alors la cha?ne est trouvée.
    print(find) -- Alors find donne l’index du premier caractère de la cha?ne trouvée (ici 5).
end

On peut aussi ajouter un argument z pour commencer la recherche à une certaine position.

local MA_VARIABLE = "Je suis quelqu'un qui suis une autre personne."
local resultat = string.find(MA_VARIABLE, "is", 17)

if resultat then -- Si "is" est trouvé au caractère 17 ou après, alors ...
    print(resultat) -- resultat contient la position du premier caractère trouvé (ici 25) 
end

Le string.byte(x, y, z) renvoie le code numérique des caractères (Code ASCII) de la string x.

local MA_VARIABLE = "Je suis une gentille personne"
local RESULTAT_ASCII = string.byte(MA_VARIABLE)

print(RESULTAT_ASCII) --> Retourne dans la console le résultat de la conversion de la string en code numérique ASCII

On peut aussi utiliser l'argument y pour définir un début de conversion ainsi que l'argument z pour définir la fin de conversion (numéro de caractère).

local MA_VARIABLE = "Je suis une gentille personne"
local RESULTAT_ASCII = string.byte(MA_VARIABLE, 1, 10) --> Retourne la conversion du caractère 1 à 10 de la string

print(RESULTAT_ASCII) --> Retourne dans la console le résultat de la conversion en ASCII du caractère 1 à 10 de la string.

Le string.char(x) convertit le code numérique x qui est en code ASCII en caractères normaux.

local ASCII_CODE = 74
local RESULTAT = string.char(ASCII_CODE)

print(RESULTAT) --> Retourne dans la console la conversion du code numérique ASCII en caractères numériques (de la variable ASCII_CODE)

Le string.dump(x) convertit la fonction x en une représentation binaire utilisable par la fonction loadString(y).

function demonstration()
    print("Lancement de la fonction")
end

local dumped = string.dump(demonstration)
assert(loadstring(dumped)) ()

--> Retourne dans la console "Lancement de la fonction."

Le string.format() renvoie une chaine de caractères formatée.

print(string.format("Je suis %s, j'adore les %s, et j'aime le nombre %i", "gentil", "bananes", 15))
--> Je suis gentil, j'adore les bananes, et j'aime le nombre 15

--> %s permet de rajouter des strings
--> %i permet de rajouter des nombres

Le string.gmatch(x, y) renvoie une sous-cha?ne de la cha?ne principale x.

for i in string.gmatch("Je suis quelqu'un de gentil", "%a+") do
	print(i)
end

--> Je
--> suis
--> quelqu
--> un
--> de
--> gentil

Le string.gsub(x, y, z) remplace les mots y d'une string x par un autre mot z.

print(string.gsub("Je suis une personne", "une personne", "un zombie")) -- string.gsub(x(la string), y(mot à remplacer), z(mot qui remplace))

--> Je suis un zombie

Le string.upper(x) renvoie le texte d'une string x en changeant les minuscules en MAJUSCULES (sauf caractères spéciaux).

local MA_STRING = "Je suis un éléphant Rose"
print(string.upper(MA_STRING))

--> JE SUIS UN éLéPHANT ROSE

Le string.lower(x) renvoie le texte d'une string x en changeant les MAJUSCULES en minuscules.

local MA_STRING = "JE SUIS QUELQU'UN"
print(string.lower(MA_STRING))

--> je suis quelqu'un

Le string.reverse(x) retourne le texte d'une string x en inversant la cha?ne de caractères.

local MA_STRING = "je suis un scripter"
print(string.reverse(MA_STRING))

--> retpircs nu sius ej

Le string.sub(x, y, z) renvoie la sous-cha?ne de x formée des caractères allant des indices y à z inclus (ou à la fin si z est absent). Si y ou z est négatif, la position est comptée à partir de la fin de la cha?ne x.

local MA_STRING = "je suis un scripter"
print(string.sub(MA_STRING, 1, 7))   --> je suis
print(string.sub(MA_STRING, -2))     --> er
print(string.sub(MA_STRING, -5, -1)) --> ipter

Le string.rep(x, y) concatène y fois le contenu de la string x.

local MA_STRING = "je suis "
print(string.rep(MA_STRING, 5))

--> je suis je suis je suis je suis je suis

Le string.match(x, y, z) renvoie une sous-cha?ne de caractères de la string x conforme au motif indiqué en y, et en cherchant à partir du caractère z (qui est facultatif).

local MA_STRING = "Je suis un scripter"
print(string.match(MA_STRING, "s..."))         --> suis
print(string.match(MA_STRING, "s...", 12))     --> scri

La fonction pairs()

[modifier | modifier le code]

La fonction pairs(x) énumère les index et les valeurs d'un tableau x. Elle replace table.foreach(), obsolète depuis Lua 5.1. A chaque itération, pairs(x) renvoie un index et la valeur associée à cet index dans le tableau. On prend souvent les noms de variables i et v: ainsi dans ? for i, v in pairs(x) do …?, i est un index dans x, et v est la valeur x[i].

local tableau = {"premier", "second", "troisième", "quatrième", "cinquième"}

for i, v in pairs(tableau) do
    print(i, v)
end

--> Résultat dans la console:
-- 1 premier
-- 2 second
-- 3 troisième
-- 4 quatrième
-- 5 cinquième

On peut aussi utiliser pairs() pour rechercher et retirer une valeur d'un tableau:

local tableau = {"un", "deux", "trois", "quatre", "cinq"}

for index, value in pairs(tableau) do
    if value == "trois" then
        table.remove(tableau, index) -- Retire du tableau la valeur trois.
        break -- Arrêt de la boucle.
    end
end

La fonction pcall()

[modifier | modifier le code]

La fonction pcall() sert à capturer les erreurs qui surviennent dans une fonction. Dans ce cas, pcall() empêche l’arrêt du script et fournit les informations sur l’erreur.

 pcall(function()
	print(table.find("s")) --> est une erreur.
	print("Salut")
end)

print("Je suis quelqu'un de gentil")

--> Dans la console:
-- Je suis quelqu'un de gentil

La fonction pcall() renvoie deux valeurs qui renseignent sur une erreur éventuelle:

local success, err = pcall(function()
	print(table.find("s")) --> est une erreur.
	print("Ca marche")
end)

print("Je suis quelqu'un de gentil")

if not success then -- Faute de succès, informer sur l’erreur
    print(err)
end

--> Dans la console:
-- Je suis quelqu'un de gentil
-- Script:2: invalid argument #1 to 'find' (table expected, got string)

Extensions de Lua avec l’API C

[modifier | modifier le code]

Comme expliqué dans PIL[4], la communication entre Lua et un programme C utilise une pile pour surmonter deux difficultés:

  • l’allocation de mémoire : elle est manuelle en C, alors que Lua a son ramasse-miettes. Les objets sont épargnés par le ramasse-miettes tant qu’ils sont sur la pile.
  • les types de données: statiques en C, dynamiques en Lua. l’API C offre notamment des fonctions de conversion entre les valeurs sur la pile et les types du C.

L’API C gère aussi la persistence des données par deux mécanismes[5]:

  • un registre (qui permet à toutes les fonctions C de partager des informations)
  • les "upvalues" (valeurs de contexte que l’on peut associer à une fonction C). Cela permet entre autres à un programme C de prendre une seule fonction C pour en tirer plusieurs fonctions LUA -- des closures -- qui ne diffèrent que par leur contexte. L’exemple classique est celui des fonctions de comptage dont les compteurs doivent être indépendants.

Hello World

[modifier | modifier le code]
print('Hello World!')
----------------------------
io.write("Hello World!")

Fonction donnant le type d’un objet, et les indices, types et valeurs de ses éléments si c’est un objet table. Peut servir comme aide-mémoire des fonctions de bibliothèque io, table, string, etc.

function help(o)             -- essayer help(io), help(table), …
  local t = type(o)          -- Type sous forme de cha?ne
  print("Type:", t)
  if (t=="table") then
    local i,v
    for i,v in pairs(o) do   -- Fonction d’itération pairs
      print(i,type(v),v)     -- Ex: ?stdin userdata  file (00007FF96219F490)?
    end
  end
end

Lua a été embarqué dans la PlayStation Portable de Sony, grace au programme Lua Player, et plus récemment Lua Player HM et Lua Player Euphoria qui permettent de lire des applications écrites avec Lua afin d'étendre les capacités de la console. Viendra plus tard l'XtreamLua Player, destiné à la création de jeux vidéo. Une modification (non officielle) du micrologiciel de la PSP permettait de lancer des programmes non-signés par Sony d'où la création d'un interpréteur Lua adapté pour la PSP.

Lua Player Euphoria reprend la syntaxe du Lua Player original et exécute le script à une vitesse fulgurante comparé au Lua Player HM. Cependant, Lua Player Euphoria est moins complet que son homologue plus ancien.

Lua Player One, un des derniers Lua Player mis à jour pour PSP, est un Lua Player développé au sein d'une communauté de développeurs espagnols ; il permet, entre autres, de gérer la 3D sur PSP. Un jeu de mini-golf dans l'espace a été développé à l'aide de cet outil.

Lua Player Plus (LPP) est sorti sur PlayStation Vita le . Ce Lua Player permet de créer des jeux pour la console.

Lua est inclus dans la console de poche open-source Pocket Chip (projet Kickstater). En effet cette dernière embarque le programme de console virtuel Pico-8 qui permet de jouer et de créer des jeux en Lua.

Extensions de jeux vidéo

[modifier | modifier le code]

Parmi les jeux vidéo de bac à sable qui l'utilisent figurent Garry's Mod, Roblox, Core, Stormworks (en) et Minecraft. Pour ce dernier, ComputerCraft[6], un mod du jeu Minecraft, utilise Lua pour concevoir des programmes graphiques ou consoles et des ? robots ? autonomes à l'intérieur du jeu, permettant d'automatiser de nombreuses taches répétitives ; Minetest, un jeu sandbox sous licence LGPL similaire à ce dernier, utilise Lua comme langage pour l'écriture d'extensions et à l'intérieur même du jeu (via certains modes)[7] via la programmation de microcontr?leur ou de FPGA.

Il existe également un moteur de jeu utilisant Lua comme langage de programmation (une sorte de Pygame pour Lua) : L?VE.

Beaucoup d'autres jeux vidéo l'utilisent, comme World of Warcraft de Blizzard Entertainment, Far Cry (et le moteur CryEngine en général) de Crytek Studios, le logiciel multijoueurs de GTA:SA Multi Theft Auto, SimCity 4 et Natural Selection 2 de Unknown Worlds Entertainment (qui a entre autres développé Decoda, un IDE pour Lua). Enfin, certains scripts de Zoo Tycoon 2 (Blue Fang Games) sont également présents sous des formes non compilées dans les fichiers du jeu. The Binding of Isaac: Afterbirth+ est un DLC pour le jeu The Binding of Isaac: Rebirth qui permet le support de mods écrits en Lua[8].

Lua sert aussi dans jeux comme : Minetest, Transformice, Roblox, Onset, Multi Theft Auto (mod multijoueur de Grand Theft Auto: San Andreas), FiveM (mod multijoueur de Grand Theft Auto V), Factorio, Project Zomboid, nanos world[9],Balatro ainsi que les moteurs de jeu vidéo tels que le SourceEngine, L?VE, Solarus ou encore les Fantasy consoles, tel que Pico-8.

Réseau et Embarqué

[modifier | modifier le code]

Au niveau réseau, Lua sert comme hook sur Apache, Lighttpd (par défaut), Nginx (via OpenResty), dans les routeurs Cisco, dans l'analyseur de paquets Wireshark,

La compacité de Lua est très appréciée dans des systèmes embarqués tels qu'OpenWrt[10].

Le PABX Asterisk (autocommutateur téléphonique privé) propose Lua comme alternative pour étendre son plan de numérotation.

L'antispam Rspamd utilise également Lua pour son interface de programmation[11].

Autres logiciels

[modifier | modifier le code]

Lua est également utilisé pour l'extension des capacités du lecteur multimédia VLC, dans les gestionnaires de fenêtres EFL Edje d'Enlightenment, dans NeoVim pour sa configuration, ainsi que Awesome (comme langage de configuration et de script).

MediaWiki et les sites Wikimedia utilisent Lua comme langage de script pour les modèles (appelés modules)[12].

Le logiciel CraftStudio utilise Lua pour programmer les éléments dynamiques des modèles.

Le logiciel libre d'interface neuronale directe OpenVibE (en) utilise Lua comme langage de script, en particulier pour la gestion de stimuli pour les expériences de neuroscience.

Le robot IRC irccd[13] utilise Lua pour la création de plugins.

Lua est le langage de scripting principalement utilisé pour le système d'exploitation embarqué OpenWrt fonctionnant sur de nombreux routeurs. L'interface graphique d'administration LuCI est entièrement écrite en Lua.

Lua est le langage natif de Domoticz, logiciel de domotique open source. Il permet le scripting avec des fonctionnalités avancées : Domoticz déclenche automatiquement ces scripts sur les changements d’états, en fonction du temps, etc.

Lua est également le langage natif de NSBase, logiciel de gestion de bases données. Le scripting permet de dynamiser les formulaires, rapports. Lua ainsi intégré permet de créer de véritables applications de gestion de bases de données.

Le logiciel de simulation de vol spatial Orbiter et ses add-ons (UCGO, UMmu) utilisent Lua pour permettre la création aisée d'écrans de contr?le (MFD - Multi Function Display), de missions ou de vaisseaux. La création de vaisseaux, en particulier, à la différence de modules DLL, ne nécessite pas la compilation d'un fichier C++.

BeamNG.drive[14] utilise Lua pour compléter ses équations physiques.

Prosody : serveur XMPP léger écrit entièrement en lua.

L'environnement de bureau Awesome (linux) utilise aussi Lua dans ses fichiers de configuration depuis sa version 3.

FreeBSD intègre un interpréteur lua dans son chargeur depuis la version 11.3[15].

La solution qui associe le montage, l’étalonnage, les effets visuels, les animations graphiques et la post-production audio Davinci Resolve utilise Lua, Py2 et Py3.

Le logiciel de notation musicale professionnel Finale propose un plugin Lua.

Notes et références

[modifier | modifier le code]
  1. a et b [ANN] Lua 5.4.8 now available ?, (consulté le )
  2. (en)About ?, sur lua.org.
  3. (en)The Evolution of Lua ?, sur lua.org (consulté le )
  4. (en)Programming in Lua (§24) ?, sur lua.org (consulté le )
  5. (en)Programming in Lua (§27.3) ?, sur lua.org (consulté le )
  6. Site internet du mod ComputerCraft.
  7. Mode de Minetest ajoutant des circuits électroniques numériques et analogique (tels que des portes logiques, des μcontr?leurs ou des FPGA) et permettant l'automatisation de certaines actions et événements.
  8. TYRONE! NOT AGAIN! ?(Archive.org ? Wikiwix ? Archive.is ? Google ? Que faire ?), sur ? (consulté le ).
  9. nanos world?.
  10. Luci : LuCI : OpenWrt Configuration Interface, openwrt, (lire en ligne).
  11. (en)Rspamd Features — Unique features ?, sur rspamd.com.
  12. Wikipedia Signpost, Lua chosen as new template scripting language, 30 janvier 2012 (Page de projet).
  13. (en) IRC Client Daemon ?.
  14. BeamNG.drive ? (consulté le ).
  15. The FreeBSD Project | FreeBSD 11.3-RELEASE Release Notes ?, sur freebsd.org (consulté le ).

Sur les autres projets Wikimedia :

Bibliographie

[modifier | modifier le code]

Articles connexes

[modifier | modifier le code]

Liens externes

[modifier | modifier le code]

第57个民族是什么民族 bppv是什么病 白酒兑什么饮料最好喝 酵母菌属于什么菌 良人是什么意思
儿童嗓子疼吃什么药好 梨涡是什么意思 胆囊壁结晶是什么意思 为什么尿频繁怎么回事 夏字五行属什么
夏天晚饭吃什么比较好 甲钴胺治疗什么病 皮肤瘙痒用什么药最好 核磁共振和ct有什么区别 荷花代表什么象征意义
阴虚血热什么症状 心脏早博吃什么药好 回流什么意思 喝陈皮有什么好处 肺大泡是什么意思
恩五行属什么hcv8jop3ns5r.cn 8个月宝宝吃什么辅食好hcv8jop0ns0r.cn 狰狞是什么意思hcv8jop3ns7r.cn 北京大学前身叫什么hcv7jop7ns2r.cn 经常喝茶叶有什么好处hcv8jop2ns0r.cn
地中海贫血是什么jiuxinfghf.com 什么的云hcv9jop0ns8r.cn 属虎的生什么属相的宝宝好hcv8jop5ns9r.cn 护理员是干什么的sscsqa.com 屎发黑是什么原因helloaicloud.com
尿多是什么原因男性jingluanji.com 11月4号是什么星座hcv7jop9ns0r.cn 检查鼻炎要做什么检查hcv9jop5ns6r.cn 列席人员什么意思travellingsim.com 女强人是什么意思hcv7jop7ns1r.cn
庭字五行属什么hcv9jop4ns1r.cn 愚人节是什么意思hcv8jop7ns0r.cn 为什么会心悸gysmod.com shiraz是什么名字红酒hcv8jop1ns6r.cn 屋里喷什么消毒最好qingzhougame.com
百度