Loading [MathJax]/extensions/jsMath2jax.js
Abstrasy
2.0 (beta)

Piste: operator
 

operator

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.


Surcharge des opérateurs

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

Opérateurs


refs/lang/typeindex/operator.txt · Dernière modification: 2013/05/31 14:14 (modification externe)

Retour
Table des mati�res

 

     
Licence Creative Commons
   Get abstrasy at SourceForge.net. Fast, secure and Free Open Source software downloads