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 :

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é