• [^] # Re: typage mou

    Posté par (site web personnel) . En réponse à la dépêche Quelques nouvelles de Go, le langage de programmation. Évalué à 1.

    Ah, ok, merci pour la précision. Bon, alors la macro pour ne comparer que quelques champs ressemble à un truc comme ça :
    (defmacro fields-equal (a b &rest fields)
    `(and ,@(loop for f in fields
    collect `(equal (,f ,a) (,f ,b)))))

    (defstruct toto a b c x y z)

    (defparameter objet1 (make-toto :a 10 :b 20 :c "plop" :x 'plop :y 10.5 :z 10))
    (defparameter objet2 (make-toto :a 10 :b 50 :c "plop" :x 'plop :y 10.5 :z 1001))

    (fields-equal objet1 objet2 toto-a toto-c toto-y) => T
    (fields-equal objet1 objet2 toto-a toto-c toto-y toto-z) => NIL

    (macroexpand-1 '(fields-equal objet1 objet2 toto-a toto-c toto-y toto-z))
    => (AND (EQUAL (TOTO-A OBJET1) (TOTO-A OBJET2))
    (EQUAL (TOTO-C OBJET1) (TOTO-C OBJET2))
    (EQUAL (TOTO-Y OBJET1) (TOTO-Y OBJET2))
    (EQUAL (TOTO-Z OBJET1) (TOTO-Z OBJET2)))

    Évidement, on peut l'améliorer pour ne pas avoir à taper toto-*. On peut aussi imaginer faire la comparaison entre deux objets de structures différentes partageant des champs en commun (amis du type fort, bonjour :-) ).. Mais je ne suis pas sûr que ce soit vraiment judicieux.