Bon, le code ci-dessous est crade, mais dériver EQ, c'est juste associer un nombre qui s'incrémente à chaque nouveau constructeur.
C'est d'ailleurs ainsi que c'est implanté en Caml, et sans doute en Haskell.
Et ça se fait en CL assez facilement.
(Après, il serait sans doute judicieux de passer par des méthodes génériques pour pouvoir traverser automatiquement des listes, vecteurs...)
[^] # Re: typage mou
Posté par Axioplase ıɥs∀ (site web personnel) . En réponse à la dépêche Quelques nouvelles de Go, le langage de programmation. Évalué à 2.
C'est d'ailleurs ainsi que c'est implanté en Caml, et sans doute en Haskell.
Et ça se fait en CL assez facilement.
(Après, il serait sans doute judicieux de passer par des méthodes génériques pour pouvoir traverser automatiquement des listes, vecteurs...)
(defmacro init-order-table ()
(defvar *order-table* (make-hash-table :test #'eql)))
(defmacro defconstant-ordered (&rest constants)
(cons 'progn
(loop for c in constants
for i from 0
collect
`(setf (gethash ',c *order-table*) ,i))))
(defmacro compare (sym1 sym2)
`(let ((v1 (gethash ',sym1 *order-table*))
(v2 (gethash ',sym2 *order-table*)))
(cond
((= v1 v2) 'EQ)
((< v1 v2) 'LT)
(t 'GT))))
(init-order-table)
(defconstant-ordered cFoo cBar)
(list
(compare cFoo cBar)
(compare cBar cFoo)
(compare cBar cBar))
type foo = Foo | Bar;;
[(compare Foo Bar);
(compare Bar Foo);
(compare Bar Bar)];;