Variables - Vuzi/vuziks GitHub Wiki

Les variables en vuziks ne sont pas typées, et peuvent donc servir à être affectée à de multiples types de valeurs. Une variable est crée avec le mot clef new var (Variable temporaire) ou new attr (Variable membre) et prend par défaut la valeur null, qui ne correspond à aucune valeur.

 new var a = true;
 a = 2.5;
 print(a); # affiche 2.5

Il existe également des variable naturelles, entrées directement dans le code (Comme les nombres), à la différence des variables dynamiques qui sont crée à l’exécution.

Types gérés

  • numérique
  • booléen
  • tableaux
  • référence
  • unité
  • objets
  • null (Non initialisé / Aucun résultat)
  • type (Type de variable)
  • non-existant (Type renvoyé quand on accède à une donnée n'existant pas)

Par mesure de simplicité, pour le langage et pour ceux l'utilisant, il n'existe pas de conversion implicite, ni même explicite. Le vuziks utilise en effet un seul type de variable numérique, correspondant au type double du C stocké sur 64bit, assurant ainsi une gestion transparente des nombres.

Il n'est pas possible d'effectuer des opérations sur plusieurs types (Qui de toute façon n'aurait pas de sens). De même, les comparaisons de valeurs (Plus grand que, etc..) ne peuvent s'effectuer que sur des types numériques. Le liste complète est disponible avec celle des différents opération.

Type numérique

Le type numérique gère les flottant de manière naturelle. Il n'existe pas d'entiers dans notre langage, mais ceux-ci peuvent être utilisés pour stocker des entiers sans problèmes (Sur 53 bit, ce correspond à une taille supérieure des entiers en C (int sur 32bit). Il existe donc un opérateur de division entière si l'ont souhaite une division entière.

On peut écrire un numérique de plusieurs manières :

new var a = 12; # Sans partie flottante
new var b = 12.0; # Même valeur que a, a == b renverra vrai

Type booléen

Le type booléen ne peut prendre que les valeurs true et false. Il s'agit du résultat de chaque opération logique. On peut les utiliser dans des variables avec les valeurs true et false.

new var a = true; # a vaudra vrai

Type objet

Un vuziks un objet n'est pas un objet au sens orienté objet du terme. En effet le langage ne gère pas des éléments comment les droits d'accès ou l'héritage. Ici l'objet représente simplement un contexte d’exécution avec les variables associées.

Les objets, tout comme les autres types de variables complexes, fonctionne par référence et non par copie.

On peut déclarer un objet avec le mot clef new suivit de l'appel à la fonction correspondante, qui sert alors de constructeur : la valeur du return (si présente) est ignorée, et les attribut définis stocké dans l'objet créé.

Type chaîne de caractère

Les chaines de caractère sont des données qui permettent de stocker des caractères. Pour créer une chaîne de caractère, il faut utiliser les guillemets double " ou simple ' et écrire sa chaîne entre. Il est possible d'effectuer des opérations sur les chaines, comme par exemple des concaténations.

 new var a = "Hello";
 new var b = " world!";

 console.println(a.append(b)); # Affiche Hello world!

Type tableau

Les tableau sont un type de donnée qui permet de stocker des variables génériques en utilisant un système de clef. Pour créer un tableau, il convient d'utiliser les crochets [ et ] comme ceci :

new var a = [12, 14, 16]; # Tableau classique
new var b = []; # Tableau vide
new var c = ['a' => 12, 'b' => 14, 'c' => 16]; # Tableau associatif

Les tableaux sont uniquement associatifs. De manière implicite les clefs correspondent aux numéros des cases, de 0 à n. Pour ajouter une valeur au tableau il faut soit utiliser une clef ne renvoyant vers aucune valeur :

new var c = ['a' => 12, 'b' => 14, 'c' => 16]; # Tableau associatif
c['d'] = 18; # Ajout du couple clef/valeur 'd' et 18
new var d = [1, 2, 3];
d[3] = 4; # Ajout de la valeur 4 avec la clef 3

Soit utiliser des crochets vides, qui se chargeront de de définir une clef de manière automatique. Cette clef prendra la valeur de la plus grande clef numérique présente dans le tableau + 1, ou bien 0 si aucune clef numérique n'est présente.

new var c = ['a' => 12, 'b' => 14, 'c' => 16]; # Tableau associatif
c[] = 18; # Ajout du couple clef/valeur 0 et 18
new var d = [1, 2, 3];
d[] = 4; # Ajout de la valeur 4 avec la clef 3

En cas d'accès à une clef n'étant pas référencée, la valeur non-existant sera renvoyée, sans générer d'erreur.

new var d = [1, 2, 3];
e = d[6]; # Valeur null dans e

Type fonction

Une fonction désigne en réalité simplement un lien vers une unité de code du langage. Il n'existe pas de liste de fonctions/classes dans la langage, c'est pourquoi il est nécessaire de stocker les références de ces unités de traitement dans des variables.

D'un point de vue fonctionnement, tout le code est analysé avant traitement, signifiant que l'unité à déjà été traitée et stockée en mémoire. Chaque variable contient en réalité uniquement une référence vers cet élément, permettant de construire un objet ou d'effectuer une opération suivant si on sauvegarde ou non son contexte d'éxécution :

 new var ref = fonction(a) {
    return a + 1;
 };

 // Utilisé comme une fonction
 new var r = ref(12);

Type 'type'

Ce type représente un type de variable. Il est possible de récupérer le type d'une variable avec l'opérateur typeof, et de comparer le type d'une variable avec l'opérateur is :

typeof a; # type de a
a is num; # true si a est un nombre, faux sinon

Type null

Ce type représente soit une variable non initialisé, soit un valeur de retour d'une fonction ne renvoyant aucun résultat. On peut affecter cette valeur à un nombre avec le mot clef null. Il est important de tester cette valeur avec === (Opérateur de comparaison de type), sinon celui-ci testera s'il s'agit des même null (Stocké à la même adresse mémoire).

new var a; # a vaut null
new var b; # b vaut null

a == b; #  vaut false
a === b; # vaut true

Type non-existent

Ce type représente une variable n'existant pas en mémoire. Il n'est logiquement impossible d'affecter une valeur de ce type dans une variable. Tout comme le type null, il est important de tester avec === plutôt qu'avec un simple ==.

Cette valeur peut servir de test, par exemple pour un accès tableau :

new var d = [1, 2, 3];
if(d[5] === nonexistent) {
   # La case n'existe pas
} else {
   # La case existe
}

Il est également possible d'utiliser l'opérateur de test d'existence ? qui permet de vérifier plus simplement si une valeur existe ou non :

if( ?a ) # si a existe
    return a;
else # sinon..
    return 0;

Durée de vie des variables

Les variables naturelles sont toujours passées en copie, alors que les variables complexes (Contenant autre chose que des variables naturelle : tableau, objet) sont passées en référence. Si l'on souhaite effectuer une copie, il faudra la réaliser manuellement.

Variables temporaires

Ce type de variable, déclarée avec new var a pour durée de vie l'exécution du bloc. Une fois cette exécution terminée, elles ne seront plus accessibles (Par exemple dans le cas d'une condition ou d'une fonction).

Variable membres

Ce type de variable, déclarée avec new attr a pour durée de vie celle de l'objet où elle est associée. Ils sont accessible avec l'opération . à côté de l'objet en question. Toute fonction appelée à l'intérieur d'un objet, même depuis l'extérieur, pourra utiliser les attributs de l'objet ou elle est stockée.

Opérateurs

Il existe des opérateur de calcul, permettant d'effectuer des opérations mathématiques entre deux nombres, et des opérateurs de comparaisons qui permettent de comparer des nombres/tableau/objets entre eux, ainsi que des opérateurs logiques et spéciaux.

Calcul

Signe Définition Type attendu
a + b Addition de deux nombres Numérique
+a Plus unaire Numérique
a - b Soustraction de deux nombres Numérique
-a Moins unaire Numérique
a * b Multiplication de deux nombres Numérique
a / b Division de deux nombres Numérique
a : b Division entière de deux nombres Numérique
a % b Modulo de deux nombres Numérique
a ^ b Puissance d'un nombre par un autre Numérique
a = b Affectation (Uniquement possible vers une variable dynamique) Tout type

Comparaison

La particularité de ces opérateurs est de donner comme résultat un booléen. Certains attendent même un booléen en entrée.

Signe Définition Type attendu
a > b Supérieur Numérique
a >= b Supérieur ou égal Numérique
a < b Inférieur Numérique
a <= b Inférieur ou égal Numérique
a == b Égalité Tout type
a != b Différence Tout type
a === b Comparateur de type Tout type
!a Contraire logique Booléen
a and b ET logique Booléen
a or b OU logique Booléen
?a Test d'existence Tout type

Autre

Signe Définition Type attendu
a.b Accession d'attribut Objet
var a Recherche de a dans les variables Tout type
attr a Recherche de a dans les attributs Tout type
new var a Nouvelle variable a -
new attr a Nouvel attribut a -
function() { -- }; Nouvelle fonction -
new a() Nouvel objet en utilisant a comme constructeur Objet
dump a Affiche les informations de a Tout type
typeof a Retourne le type de a Tout type
a is b Test si le type de a correspond à b Type
return a Termine la fonction courante en retournant la valeur de a Tout type
break Termine la boucle courante Aucun