Les opérateurs sont les fonctions internes et réservées du langage. Ils forment un ensemble d'éléments abstraits fonctionnels. En effet, contrairement aux fonctions classiques, les opérateurs n'ont pas de constructeur. Chaque opérateur est une identité abstraite et immuable qui ne peut être redéfinie.
(display (==? display display)) (display (==? string number)
⇒
(true) (false)
Une particularité remarquable des opérateurs est d'être aussi des données. On peut donc les utiliser comme telles sans limitation particulière.
(function 'make-cycle{ (args 'min-v 'max-v) (define '$i min-v) (define '$op +) (return (function { (define 'j $i) (if{<=? $i min-v} {set! $op +}) # Ici, on affecte la variable $op de l'opérateur approprié (if{>=? $i max-v} {set! $op -}) # en fonction de l'état du compteur $i. (set! $i ($op $i 1)) # On l'utilise ici. (return j) }) ) }) (define 'cycl (make-cycle 1 3)) (display (cycl)) (display (cycl)) (display (cycl)) (display (cycl)) (display (cycl)) (display (cycl)) (display (cycl)) (display (cycl)) (display (cycl))
⇒
1 2 3 2 1 2 3 2 1
Dans cet exemple, on affecte la variable $op de l'opérateur approprié en fonction de l'état du compteur $i. On implémente ainsi un générateur cyclique à progression arithmétique très simple. On pourrait aussi aisément faire de la même manière un générateur cyclique à progression géométrique en se basant sur le même principe.
Bien qu'on ne puisse pas redéfinir les opérateurs, on peut définir leur comportement en fonction du type d'objet manipulé. Pour cela, Abstrasy propose un large éventail d'opérateurs génériques que l'on peut surcharger au niveau des objets.
(constructor 'MonObj{ (args 'valeur) (function ':add{ # Surcharge de l'opérateur +. (define '$v (argv)) (define '$t valeur) (while{$v} { (set! $t (+ $t (number (car $v)))) # On utilise l'opérateur number. (set! $v (cdr $v)) } ) (return (MonObj $t)) }) (function ':string{ # Surcharge de l'opérateur string. (return (+ "valeur = " valeur)) }) (function ':number{ # Surcharge de l'opérateur number. (return valeur) }) }) (define 'o1 (MonObj 10)) (define 'o2 (+ o1 15 (MonObj 5))) # Utilisation des opérateurs surchargés + et number. (display (string o2)) # Utilisation de l'opérateur surchargé string.
⇒
valeur = 30
|
![]() |
|
||||||||