LeekScript 4

LeekScript 4

> LeekScript

Le LeekScript 4 est la quatrième version du langage LeekScript, sortie le 1 juillet 2022. Cette page récapitule toutes les nouveautés apportées par cette version.

Array et Map séparés

Dans les versions du LeekScript 1 à 3, les tableaux étaient à fois des listes ([1, 2, 3, 4]) et des tables associatives (['a': 5, 'b': 12]). A partir du LeekScript 4, les deux aspects sont séparés dans deux types différents : les listes (Array) et les tables (Map). Ces deux nouveaux types sont plus performants que l'ancien type commun, et donnent une plus grande clarté dans l'utilisation.

Une liste Array est une suite continue d'éléments, commençant à l'indice 0. Ils sont équivalents à ArrayList de Java ou vector de C++. On peut accéder rapidement à un élément avec sa position, insérer/supprimer un élément à n'importe quelle position.

Une table Map est un objet qui relie une clé à une valeur. Ils sont équivalents aux HashMap de Java ou unordered_map de C++, les couples de (clé, valeur) ne sont pas ordonnés. Les clés peuvent être de tout type : nombre (entier ou réel), chaîne de caractère, objet, etc. On peut rapidement récupérer une valeur associée à une clé donnée. Ce nouveau type remplace l'aspect "associatif" des anciens tableaux

Nouvelles fonctions pour les listes

Retour de limite de RAM

Les nouvelles listes et cartes étant beaucoup plus performantes et légères en opérations, il était nécessaire de rétablir une limite au niveau de la RAM (mémoire de travail du programme). En effet, avec très peu d'opération il est possible de remplir des Giga de RAM facilement.

La limite de RAM est fixée à 100Mo (avant la MàJ 2.40) pour chaque IA (entité + invocations) par combat, ce qui correspond à 12 500 000 éléments de liste, de table ou d'objet. Cette limite est effective en LS4 car les anciens tableaux n'utilisent pas ce système de RAM, ils n'en n'ont pas besoin car leur consommation d'opération est suffisamment grande.

Les fonctions getMaxRAM() et getUsedRAM() sont ajoutés pour surveiller sa consommation de RAM en temps réel.

Entiers sur 64 bits au lieu de 32

Les entiers sont maintenant représentés sur 64 bits au lieu de 32 auparavant (dans toutes les version du LeekScript). L'augmentation permet de faire des calculs avec des nombres plus grands et permet d'avoir plus de bits pour les manipulations binaires.

Fonctions flèches

La syntaxe "Fonction flèche" est maintenant disponible pour écrire plus simplement des fonctions anonymes :

Paramètres par défaut

Dans les constructeurs, méthodes et méthodes statiques, il est maintenant possible d'utiliser des valeurs par défaut pour chaque paramètre :

Accès d'une plage d'une liste et indices négatifs

Deux nouvelles possibilités sont ajoutées pour accéder à des listes :

Changement de l'opérateur == et opérateur === déprécié

L'opérateur ==, qui réalisait certaines vérifications d'égalités exotiques comme 1 == true ou 12 == [12] pouvant prêter à confusion a désormais le même comportement que l'opérateur === qui lui est déprécié.

Nombres en Hexadécimal et Binaire

Il est possible d'écrire des nombres sous forme hexadécimale et binaire, en plus de décimale (merci à Karang pour la PR) :

var a = 0xabcdef // 11259375 var b = 0b110110101 // 437

Séparateurs "_" de nombre

Il est possible d'écrire de longues constantes numériques avec des séparateurs souligner "_", exemple :

var un_milliard = 1_000_000_000

Ordre des arguments des callbacks

Dans les fonctions arrayMap, arrayFilter, arrayIter, arrayPartition, arrayFoldLeft/Right, les fonctions callbacks prennent les arguments (value, clé/index) toujours dans cette ordre. L'ordre était (clé, valeur) et (valeur) précédemment.

De plus, toutes ces fonctions prennent en 3ème paramètre le tableau en train d'être parcouru.

Il est donc possible de passer n'importe quel nombre d'argument à un callback, les valeurs manquantes étant remplacées par des null.

Changements sur fonctions

Vérification basique des types des arguments

Toutes les fonctions du jeu ont été typées précisément, ce qui permet de rajouter des erreurs lorsqu'un paramètre est incompatible avec le type attendu d'une fonction.

L'inférence de type étant encore très basique et vouée à évoluer, ces erreurs de type sont pour l'instant des avertissements.

Priorité de a = b = c

Il est maintenant possible d'écrire a = b = c sans parenthèses.

Clé dupliquée dans une déclaration de table

Lors de la déclaration d'une table, une erreur (LS4+) ou un warning est renvoyé si une clé apparaît en double :

Complexité des fonctions dans la documentation

La complexité de chaque fonction est affichée dans la documentation.

JSON encodage/décodage des objets et nouvelles listes

Les fonctions JSON jsonEncode et jsonDecode gèrent maintenant les nouvelles listes et les objets :

jsonDecode("[1, 2, 3]") : renvoie une nouvelle liste

jsonEncode("{a: 2, b: 4}") / jsonDecode("{a:2,b:4}") : fonctionne avec des objets.

Fonctions sur les nombres

Constantes pour les nombres

Mot-clé final pour les champs de classe.

Il est possible d'utiliser le mot-clé final devant un champ de classe pour indiquer que ce champ n'est plus affectable après la construction de l'objet. Une affectation est l'utilisation de l'opérateur =, il est toujours possible de modifier le contenu du champ si il est de type objet ou liste par exemple. Pour un champ final de type tableau, il faut donc utiliser arrayClear(objet.champ) au lieu de objet.champ = [].

Opérateur \ et \= de division entière

Les opérateurs \ et \= sont ajoutés pour réaliser des division entières ou euclidiennes, par exemple :

Il faut savoir que les deux nombres sont convertis en entiers s'ils n'en sont pas déjà :

Corrections et améliorations diverses