LoriotPro Extended Edition Programmation en language LUA

Table des matières

HelpLUA

Les expressions en LUA

Définition

Les expressions en LUA sont évaluées afin d'exécuter les calculs pour affecteer des valeurs aux variables ou pour passer des arguments aux fonctions.

Nous emploierons = la notation racourcie dans ce document. Les valeurs peuvent facilement être assignées à une variable, par exemple,

> x = 7
> print(x)
7
> = 7
7

Expressions arithmétiques

Lua utilise les opérateurs habituels d'arithmétique binaire.

> = 2+3, 5-12, 2*7, 7/8
5 -7 14 0.875
> = 5*(2-8.3)/77.7+99.1
98.694594594595

Négation unaire :

> = -(-10), -(10)
10 -10

Puissance de :

> = 7^2, 107^0, 2^8
49 1 256

Expressions de comparaison

On fournit des opérateurs relationnelles qui renvoient les valeurs booléennes true ou false.

Exemples :

> = 1 == 1, 1 == 0
true false
> = 1 ~= 1, 1 ~= 0
false true
> = 2 < 7, 2 > 7
true false
> = 3 <= 7, 7 <= 7, 8 <= 7
true true false
> = 3 >= 7, 7 >= 7, 8 >= 7
false true true

Ceux-ci opérent également sur des chaînes de caractères et d'autres types.

> = "abc" < "def"
true
> = "abc" > "def"
false
> = "abc" == "abc"
true
> = "abc" == "a".."bc"
true

Les objets ne seront pas égaux si les types sont différents ou se rapportent à différents objets.

> = {} == "table"
false
> = {} == {} -- two different tables are created here
false
> t = {}
> t2 = t
> = t == t2 -- we're referencing the same table here
true

La coercition ne fonctionne pas ici, les types doivent être convertis explicitement. Voir Nombres et Chaînes pour l'explication de la coercition.

> = "10" == 10
false
> = tonumber("10") == 10
true

Opérateurs logiques

Lua dispose des opérateurs logiques and, or et not. En Lua tous nil et valeur booléenne false représentent false (faux) dans une expression logique. Quelque chose qui n'est pas faux (l'un ou l'autre nil ou false) est true (vrai). Il y a plus de notes sur les implications de ceci à la fin de cette page.

> = false==nil -- although they represent the same thing they are not equivalent
false
> = true==false, true~=false
false true
> = 1==0
false
> = does_this_exist -- test to see if variable "does_this_exist" exists. no, false.
nil

not - (n'est pas)

Le mot-clé not inverse une valeur logique d'expression :

> = true, false, not true, not false
true false false true
> = not nil -- nil represents false
true
> = not not true -- true is not not true!
true
> = not "foo" -- anything not false or nil is true
false

and - (et)

L'opérateur binaire and ne renvoie pas nécessairement une valeur booléenne true ou false à l'expression logique X et y. Dans certains languages, l'opérateur and retourne une valeur booléenne dépendante des deux valeurs entrées. Par contre dans Lua, elle renvoie le premier argument si sa valeur est false ou nil, et le deuxième argument si le premier argument n'était pas faux. Ainsi, un booléen est seulement retourné si les valeurs passées étaient booléen.

> = false and true -- false is returned because it is the first argument
false
> = nil and true -- as above
nil
> = nil and false
nil
> = nil and "hello", false and "hello"
nil false

Toutes les expressions ci-dessus renvoient le premier argument. Toutes les expressions suivantes renvoient le deuxième argument, car le premier est vrai.

> = true and false
false
> = true and true
true
> = 1 and "hello", "hello" and "there"
hello there
> = true and nil
nil

Comme vous pouvez voir que les expressions logiques sont encore évaluées correctement mais nous avons un comportement intéressant en raison des valeurs retournées.

or - (ou)

or L'opérateur binaire également ne renvoie pas nécessairement une valeur booléenne (voir les notes pour and ci-dessus). Si le premier argument n'est pas faux il est retourné, autrement le deuxième argument est retourné.

> = true or false
true
> = true or nil
true
> = "hello" or "there", 1 or 0
hello 1

Ceci peut être une propriété très utile. Par exemple, plaçant des valeurs par défaut dans une fonction :

> function foo(x)
>> local value = x or "default" -- if argument x is false or nil, value becomes "default"
>> print(value, x)
>> end
>
> foo() -- no arguments, so x is nil
default nil
> foo(1)
1 1
> foo(true)
true true
> foo("hello")
hello hello

Opérateurs ternaires

Les opérateurs ternaires sont un dispositif utile dans le C. par exemple. int value = x>3 ? 1 : 0;

Ce comportement peut être partiellement émulé dans Lua en utilisant les opérateurs logiques and et or. La forme de C :

value = test ? x : y;

traduit en Lua :

value = test and x or y

Par exemple.

> print( 3>1 and 1 or 0 )
1
> print( 3<1 and 1 or 0 )
0
> print( 3<1 and "True" or "False" )
False
> print( 3>1 and true or "false" )
true

Cependant, il y a une limite, ceci fonctionne seulement quand la première valeur de retour n'est pas nil ou false.

> print( 3>1 and 1 or "False" ) -- works
1
> print( 3>1 and false or "oops" ) -- failed, should return false
oops
> print( 3>1 and nil or "oops" ) -- failed, should return nil
oops

Les expressions conditionnelles et la valeur nil

Un point important à noter est que la valeur 0 n'est pas une condition d'essai fausse dans Lua. Dans d'autre langage, par exemple C, un test :

if (0)
printf("true");
else
printf("false");

montrerait "false".

Dans Lua,

> if 0 then
>> print("true")
>> else
>> print("false")
>> end
true

affiche "true".

Vous devriez employer false, ou nil au lieu de 0 :

> if false then print("true") else print("false") end
false
> if nil then print("true") else print("false") end
false

Pourquoi ?

La raison de ceci est historique. Lua n'a pas soutenu les types booléens (c.-à-d. true et false) avant la version 5.0. Avant la version 5.0 une valeur nil représentatit false (faux). Maintenant, tous les deux nil et false agiront en tant qu'état faux dans une expression conditionnelle. Par exemple,

> if nil then print("true") else print("false") end
false
> if 1 then print("true") else print("false") end
true
> if 0 then print("true") else print("false") end
true
> if 1==2 then print("true") else print("false") end
false

Un autre point à noter est celui true et false ne sont des valeurs numériques, par exemple, 1 et 0 comme dans d'autres languages.

> = true, false
true false
> = 1 + true
stdin:1: attempt to perform arithmetic on a boolean value
stack traceback:
stdin:1: in main chunk
[C]: ?

En outre, nil est forcé à une valeur booléenne une fois utilisé avec un opérateur logique :

> = not nil
true
> = not 1
false
> = not 0
false



LUTEUS www.loriotpro.com