Types et valeurs
YScript est dynamiquement typé : les variables n'ont pas de type, seules les valeurs en ont un.
Il existe huit types de valeurs : nil, booléen, nombre, chaîne, table, fonction, userdata et
thread (coroutine).
nil
nil est le type d'une absence de valeur. Une variable non initialisée vaut nil, comme un
champ de table jamais renseigné (t.x vaut nil si x n'a jamais été affecté).
local a
print(a) --> nil
print(a == nil) --> true
Booléen
true et false. Voir plus bas la notion de valeur « fausse » utilisée par if, while,
and/or, not, qui est plus large que le seul type booléen.
Nombres
YScript distingue deux sous-types de nombre : entier (64 bits signé) et flottant (double
précision IEEE 754). Le sous-type est conservé au travers des opérations lorsque c'est possible
(un + entre deux entiers reste un entier) et bascule en flottant dès qu'un opérande flottant
intervient, ou pour les opérations qui l'exigent (^).
print(1 + 2) --> 3 (entier)
print(1 + 2.0) --> 3.0 (flottant)
print(2 ^ 10) --> 1024.0 (^ produit toujours un flottant)
Littéraux numériques
42 -- entier décimal
0x2A -- entier hexadécimal
0b101010 -- entier binaire
3.14 -- flottant
.5 -- flottant (0.5)
1e3 -- flottant avec exposant, sans point décimal (1000.0)
1.0e3 -- flottant avec exposant (1000.0)
2.5E-2 -- exposant négatif (0.025)
Il n'existe pas de notation octale (0o...) ni de littéral hexadécimal flottant.
Chaînes
Une chaîne est une séquence de caractères. Deux formes de littéraux :
'texte simple'
"texte simple"
[[texte
sur plusieurs lignes, sans interprétation des échappements]]
[==[texte contenant ]] sans ambiguïté grâce au niveau de crochets]==]
Dans une chaîne courte ('...'/"..."), les séquences d'échappement suivantes sont reconnues :
| Séquence | Signification |
|---|---|
\a \b \f \n \r \t \v |
caractères de contrôle usuels |
\\ \' \" |
backslash, apostrophe, guillemet |
\<saut de ligne> |
saut de ligne littéral inséré dans la chaîne |
\z |
ignore tous les espaces/sauts de ligne qui suivent (utile pour indenter une chaîne longue sur plusieurs lignes source) |
\ddd |
caractère par code décimal (jusqu'à 5 chiffres) |
\0ooo |
caractère par code octal, introduit par un 0 (jusqu'à 6 chiffres octaux après le 0) |
\xHH, \uHHHH (majuscule ou minuscule) |
caractère par code hexadécimal (jusqu'à 4 chiffres hexadécimaux) |
\x{H...}, \u{H...} |
équivalent avec accolades, nombre de chiffres hexadécimaux libre — accepte tout point de code Unicode (U+0-U+10FFFF), encodé en paire de substitution UTF-16 au-delà de U+FFFF |
Une chaîne longue ([[...]], ou [=[...]=] avec autant de = que nécessaire pour éviter toute
ambiguïté avec le contenu) ne subit aucune interprétation d'échappement et peut s'étendre sur
plusieurs lignes ; un saut de ligne qui suit immédiatement le crochet ouvrant n'est pas inclus
dans le contenu.
Tables
Le seul type structurant du langage : un tableau associatif pouvant utiliser n'importe quelle
valeur (sauf nil et NaN) comme clé.
local t = { 1, 2, 3, x = 10, ["y-z"] = 20 }
print(t[1], t.x, t["y-z"]) --> 1 10 20
t.x = nil -- supprime la clé
Voir Expressions pour la syntaxe du constructeur et Métatables pour la personnalisation du comportement d'une table.
Fonctions
Les fonctions sont des valeurs de première classe : elles peuvent être stockées dans des variables/tables, passées en argument, retournées. Voir Fonctions.
Userdata et thread
userdata enveloppe une donnée .NET exposée au script (typiquement produite par un module
externe ou l'hôte), éventuellement avec une métatable définissant son comportement scripté.
thread représente une coroutine. Ces deux types sont surtout manipulés via la bibliothèque
standard et l'API d'hébergement — hors du périmètre de cette section.
Valeur fausse
if, while, repeat...until, and, or et not évaluent une valeur comme fausse dans les
cas suivants :
nil(ou absence de valeur) ;false;- le nombre entier
0; - le nombre flottant
0.0.
Toute autre valeur — y compris une chaîne vide "" et une table vide {} — est considérée comme
vraie.
if 0 then print("vrai") else print("faux") end --> faux
if "" then print("vrai") else print("faux") end --> vrai
Voir Différences avec Lua : en Lua standard, seuls nil et false sont
faux — 0 y est une valeur vraie.
Conversions et égalité
==/~=comparent d'abord les types : deux valeurs de types différents sont toujours inégales, sauf si ce sont deux nombres (entier et flottant se comparent alors par valeur numérique). Deux tables ou deux userdata ne sont égaux que s'il s'agit du même objet, sauf métaméthode__eq(voir Métatables).- Les opérateurs arithmétiques convertissent automatiquement un opérande chaîne en nombre s'il
représente un nombre valide (
"10" + 1vaut11) ; une chaîne non numérique lève une erreur. - La concaténation (
..) convertit automatiquement ses opérandes numériques en chaîne, mais pas les booléens,nil, tables, etc.