• [^] # Re: "The Right Thing" vs "Worst is Better"

    Posté par . 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

    incr_int(x) = x + 1
    incr_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 + y
    plus_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.