Pollux (./33) :
Alors j'ai pas dû comprendre comment on s'en sert, tu pourrais écrire un exemple d'utilisation ?
Si le pointeur que l'on donne pour remplacer l'expression est contenu dans la pile de MAY, c'est une expression => Donc on ne peut remplacer que des expressions avec.
Si le pointeur que l'on donne pour remplacer l'expression n'est pas contenu dans la pile de MAY, c'est une fonction => Donc on ne peut remplacer que des fonctions avec.
Pollux (./33) :
OK, mais du coup il faut faire ton propre affichage, et surtout il faut refaire un parseur from scratch non ?
Oui, mais comme on peut réutiliser le parseur précédent en grande partie, ce n'est pas si génant.
Pollux (./33) :
Et tu devrais éviter de parler de buffer interne : après tout, si on affiche directement sur stdout, il n'y aura pas de buffer interne... Peut-être aussi que convert2str n'est pas un nom idéal, un truc genre display() ou stringify() serait plus générique et plus proche des autres noms de fonction ?
Ok
Pollux (./33) :
Alors il faut aussi préciser que ça reste valide aussi si on avait construit une autre expression non évaluée qui dépend d'elle : même si on n'évalue pas bar il reste bien valide. Par contre si je comprends bien on n'a plus le droit d'appeler un constructeur non évalué avec cette expression en paramètre ? (et c'est quoi le rationale de ce truc-là ?)
C'est bien à cause de toutes ces complications que je sens que je vais simplifier la doc en disant que bar devient invalide.
Pollux (./33) :
Ben je verrais une formalisation des garanties fournies par MAY et des exigences qu'elle pose sur les extensions, qui serait tout aussi complète que si tu voulais prouver avec un truc genre Coq la correction de tes transformations. Par exemple les axiomes de commutativité, de distributivité, d'élément neutre, absorbant, etc. Et tes assertions ne rattraperont pas le dixième des problèmes : par exemple j'écris une extension mais il y a un bug qui fait que si je multiplie par 0 je n'obtiens pas toujours 0 (*). Du coup 0 != eval(0*ext) = subs(e=ext, eval(0*e)) = subs(e=ext, 0) = 0. Et à moins que eval() soit purement bottom-up, le problème eval o foo_c o bar_c != foo o bar va aussi se poser...
Oui les assertions ne sont pas une solution. Oui un vrai contrat serait mieux. Mais tant que je n'aurais pas des utilisateurs pour un retour pratique, je ne serais pas quel sera le meilleur compromis complexité / efficiacité / evolutivité.
Pour 0 != eval(0*ext) = subs(e=ext, eval(0*e)) = subs(e=ext, 0) = 0, je cite tout d'abord la doc:
algebraically correct, possibly except for a set of measure zero: y / y is simplified into 1.
ensuite si si e est un identifiant, il ne peut être qu'au maximum dans le domaine des complexes, donc 0*e se simplifiant en 0 est tout à fait correct. C'est le subs qui est incorrect.
Sinon rien n'empêche de faire une extesion des qui gère les identifiants non complexes, mais dans ce cas, c'est à elle de gérer 0*x qui devient [ 0].
Pollux (./33) :
Est-ce que la commutativité pour la multiplication est adéquatement représentée par un flag statique ? Comment est-ce que tu décides si un arbre commute avec un autre ? Tu regardes si absolument toutes les feuilles des deux arbres commutent pour la multiplication ? Ca peut être trop prudent, par exemple si j'ai une fonction qui prend une matrice et qui me renvoie un nombre réel (genre le déterminant) le résultat sera commutatif même s'il utilise des matrices dans les feuilles.
Qu'appelles-tu arbre / feuille ?
Par défaut, la commutativité entre classes différentes est obbligatoire (deux classes différentes sont supposées être tout le temps commutative).
C'est un choix pour simplifier l'algorithme utilisé, pour qu'il reste efficace, et qui je pense, ne limite pas vraiment en pratique.
Pollux (./33) :
Comment est-ce que tu évalues la commutativité multiplicative d'un identifiant ? S'il représente une matrice, ben ça commute pas...
Un identifiant est au dans le domaine des complexe (Voir may_kernel_domain). Si après tu t'amuses à le remplacer par une matrice, tu changes les règles.

squalyl (./37) :
(ça m'arrangerait que ce soit 4
)
Sur 32 bits ca peut être 8 (long long / sse)
Sur 64 bits, ca peut être encore plus
