Pollux (./52) :
Est-ce que le fait de vérifier si l'argument a bien été évalué est si prohibitif que ça ? Parce que sinon il suffit de supprimer add et d'utiliser add_c à la place, et puis d'appeler eval de façon paresseuse quand on en aura besoin, du coup on peut se débarrasser de tous les _c.
Sauf que une forme non-évaluée ne peut pas franchir la barrière d'une marque déposée (Ex: x =may_cos_c (may_set_ui (2)); may_mark (); x = may_cos (x); est invalide).
Sauf que ca peut nécessiter d'évaluer plusieurs fois la même expression dans 2 branches de codes différentes sauf si je taggue l'expression comme réévalué en tel endroit.
Un autre problème de eval est le intmod. Si intmod vaut 2,
may_eval (may_pow_c (may_set_ui_c (17), may_set_ui_c (5))));
ne sera pas pareil que:
may_pow (may_set_ui (17), may_set_ui (5));
car 5 sera évalué lui aussi dans Z/2Z avant l'appel à may_pow.
(Donc oui, tu avais raison).