Laurent Deniau wrote:
Je ne connais pas Slate, mais je vais lire ca. Ca a effectivement l'air
interessant. Je vois neanmoins deja un probleme: la definition de la
classe declare les methodes qu'elle implemente,
En fait, les articles montrent la problématique du multi-dispatching avec
des langages procéduraux, objet à classes, et objets à prototypes. Ensuite,
ils donnent une solution pour ces derniers. Slate est un langage objet à
prototype et non à classes. Pour le multi-dispatching, Slate se focalise
sur la programmation par sujet au lieu de par verbe :)
Un exemple de syntaxe de Slate (arrayed.slate):
Array traitsWindow atSlotNamed: #traits1 put: Sequence traits.
Array traitsWindow atSlotNamed: #traits2 put: Collection traits.
Array traitsWindow atSlotNamed: #traits3 put: Mapping traits.
"Ensures that the primitive Array type has the behaviors and features of a
Sequence."
a@(Array traits) new &capacity: n
"Array capacity is its size, and newSize: is a primitive."
[a newSize: (n ifNil: [0])].
a@(Array traits) copy
[a clone].
a@(Array traits) arrayType [a].
Il est vrai que ça a l'aire barbare comme ça :)
Ici, Array est un objet à part entière et les traits définissent tous les
méthodes que peuvent supporter des prototypes. Les traits sont parents des
prototypes, et donc des prototypes (qui sont des objets) peuvent avoir le
même trait mais chacun donne une implémentation qui leur sont propres. On
peut considérer que les traits sont l'équivalent, dans une certaine mesure,
aux fonctions génériques.
Sinon, tes exemples sont intéressants. Toutefois j'aurais une question:
pourquoi faire par une surcouche à C ce qui existe déjà avec CLOS ?
Quitte à faire une couche objet à C qui soit plus avancée à ce qui existe
déjà, pourquoi ne pas suivre son esprit, comme un peu avec C++, ou
légèrement plus éloigné, Obj; c'est à dire à prendre en compte sa nature
finalement procédurale du langage au lieu d'implémenter une syntaxe et un
mécanisme fonctionnel à la lisp/scheme ?
Miguel