Pour préciser un peu le fonctionnnement des opérateurs arithmétiques (+,-,etc) en Opa.
Ces opérateurs sont 'localement surchargés' pour être applicable à la fois à des entiers ou des flottants (comme dans la plupart des langages).
Cependant comme Opa est un langage avec inférence des types, de temps en temps il faut indiquer sur quel type de nombres travaillent les opérateurs (via les constantes et les coercions de type).
Par exemple
incr_int(x)=x+1incr_float(x)=x+1.0
définit deux fonctions travaillant respectivement sur des entiers et des flottants en utilisant le même opérateur +. Comme les constantes numériques (1 et 1.0) sont explicitement entières ou flottantes, le choix de l'opérateur (entier ou flottant) est automatique.
Même remarque pour
plus_int(x,y):int=x+yplus_float(x,y):float=x+y
où les coercions de type fournissent assez d'information pour déterminer le bon opérateur.
La surcharge ne se propage pas implicitement. Par exemple
plus(x,y)=x+y
est rejeté avec le message suivant:
Add a type annotation for a specialization in one of the following types:
int, int -> int
float, float -> float
En effet pour surcharger la fonction (ou l'opérateur), il faut l'indiquer explicitement dans la définition. (p.ex. @specialize_strict(Int.+,Float.+) pour définir +).
Pour l'instant on encourage pas l'utilisation de cette directive, car n envisage de faire évoluer ce mécanisme pour le rendre plus générique.
[^] # Re: "The Right Thing" vs "Worst is Better"
Posté par poluxmoon . En réponse à la dépêche Opa, un nouveau langage pour le développement d’applications Web. Évalué à 3.
Pour préciser un peu le fonctionnnement des opérateurs arithmétiques (+,-,etc) en Opa.
Ces opérateurs sont 'localement surchargés' pour être applicable à la fois à des entiers ou des flottants (comme dans la plupart des langages).
Cependant comme Opa est un langage avec inférence des types, de temps en temps il faut indiquer sur quel type de nombres travaillent les opérateurs (via les constantes et les coercions de type).
Par exemple
définit deux fonctions travaillant respectivement sur des entiers et des flottants en utilisant le même opérateur
+. Comme les constantes numériques (1 et 1.0) sont explicitement entières ou flottantes, le choix de l'opérateur (entier ou flottant) est automatique.Même remarque pour
où les coercions de type fournissent assez d'information pour déterminer le bon opérateur.
La surcharge ne se propage pas implicitement. Par exemple
est rejeté avec le message suivant:
En effet pour surcharger la fonction (ou l'opérateur), il faut l'indiquer explicitement dans la définition. (p.ex. @specialize_strict(Int.
+,Float.+) pour définir+).Pour l'instant on encourage pas l'utilisation de cette directive, car n envisage de faire évoluer ce mécanisme pour le rendre plus générique.