Opérateurs

CatégorieOpérateurs
Arithmétique+ - * / %
Comparaison== != < <= > >=
Logique&&/and, ||/or, !
Coalescence nulle??
Appartenancein
Binaire (bits)& | ^ ~ << >>
Assignation= += -= *= /= %= &= |= ^= <<= >>=
Incrémentation/décrémentation++ -- (postfixe)
Ternairecond ? a : b

Notes :

  • + sur deux nombres les additionne ; si l'un des deux côtés est une chaîne ou du ton.html, il concatène (en convertissant l'autre côté en texte d'abord) — le résultat est ton.html si l'un des opérandes l'était.
  • <, <=, >, >= comparent deux nombres numériquement, ou deux chaînes/valeurs ton.html lexicographiquement ; comparer toute autre combinaison (ou un tableau, un dict, un booléen) est une erreur d'exécution plutôt qu'un résultat silencieusement dénué de sens.
  • ==/!= utilisent l'égalité structurelle : nombres/booléens/nil comparent par valeur, une chaîne et une valeur html avec le même texte sont égales, et les tableaux/dicts comparent élément par élément (récursivement) plutôt que par référence — [1, 2] == [1, 2] vaut true.
  • / et % lèvent tous les deux "Division by zero" pour un côté droit à zéro, plutôt que de produire silencieusement inf/NaN.
  • and/or sont des synonymes exacts de &&/|| — utilise celui qui se lit le mieux.
  • ?? ("coalescence nulle") évalue son côté gauche et le retourne tel quel sauf s'il vaut nil, auquel cas il évalue et retourne le côté droit à la place — le côté droit n'est jamais évalué autrement, donc on peut y mettre un fallback avec effets de bord sans risque. Pratique avec les accès aux dicts : dict["manquant"] ?? "defaut".
  • in teste l'appartenance : valeur in tableau vérifie les éléments du tableau (avec les mêmes règles d'égalité que ==), valeur in dict vérifie les clés du dict, et valeur in chaine cherche une sous-chaîne. Le côté droit doit être un tableau, un dict, ou une chaîne/ton.html — toute autre valeur est une erreur d'exécution.
  • &, |, ^, ~, <<, >> traitent les deux côtés comme des entiers (en tronquant la partie décimale), opèrent sur une représentation 64 bits en complément à deux, puis reconvertissent le résultat dans le type nombre habituel de TON618 — il n'y a pas de type entier séparé, donc 6 & 3 est juste un nombre comme un autre (2). Les deux opérandes doivent être des nombres, sinon c'est une erreur d'exécution. &/|/^ partagent tous le même niveau de priorité (moins prioritaire que ==, plus prioritaire que &&) — utilise des parenthèses en les mélangeant pour plus de clarté.

Ajoutés en beta-2.0.0 :

OpérateurSensExemple
** / **=Puissance (associatif à droite)2 ** 10 vaut 1024
.. / ..=Intervalle, fin exclue / incluse0..5, 1..=10
|>Pipe : la valeur de gauche devient le premier argumentx |> f(y) vaut f(x, y)
?.Chaînage optionnel : nil au lieu d'une erreuruser?.address?.city
??=Assigne seulement si la valeur est nilconfig.port ??= 8080
.Accès à une propriété / méthodepoint.x, "hi".upper()
=>Fonction fléchéen => n * 2
  • -2 ** 2 vaut -4 : ** lie plus fort que le moins unaire, comme en maths et en Python.
  • + concatène aussi deux tableaux ([1, 2] + [3] vaut [1, 2, 3], un nouveau tableau) ; * répète une chaîne ("ab" * 3 vaut "ababab").
  • a..b s'évalue en un tableau des entiers de a à b - 1 (a..=b inclut b) ; dans une boucle for il compte de façon paresseuse, donc for i in 0..1000000 ne construit jamais de tableau.
  • ?. marche sur l'accès à une propriété, l'indexation et l'appel : obj?.name, list?.[0], callback?.(). Mets-le à chaque étape qui peut être nil.

Modifier cette page sur GitHub