Tiens Pollux se réveille

Pollux (./26) :
"might not" plutôt ? ("may not" ça veut dire qu'elle a pas le droit de copier l'expression)
Corrigé.
Pollux (./26) :
L'alignement d'un "long" peut être plus petit que celui d'une structure, je pense que tu veux plutôt "suitably aligned for a struct" (l'alignement de toutes les structures est le même, donc comme une structure peut contenir un long l'alignement est plus grand).
Faut que je revoie çà donc...
Pollux (./26) :
Je comprends pas : pourquoi on peut pas comparer bêtement les pointeurs comme avec les fonctions internes ? Tu prends le nom d'un type d'extension dans un champ et pas en appelant une méthode, donc a priori il ne bouge pas ?
Pour les extensions, ca doit marcher. Reste à savoir si je veux le documenter.
Pollux (./26) :
Et c'est quoi une user function ?
f(x), g(x), ...
Pollux (./26) :
(et sinon ça serait peut-être plus clair si tu distinguais tous les cas feuille/noeud et interne/user pour dire ce qui se passe)
Je ne décris pas du tout comment ca marche, parce que l'utilisateur n'a pas à le savoir et parce que ca va encore changer dans pas longtemps en plus.
Pollux (./26) :
Ca pose un problème d'évolutivité, qu'est-ce qui se passe si je définis une fonction digamma et qu'elle est implémentée dans une version future de maylib ? Ca veut dire qu'il faut que je préfixe toutes mes fonctions pour éviter les collisions ? Ou alors que la liste des fonctions de maylib est figée ?
Oui, il y aura conflit. Mais c'est pas trop grave, car ca fait partie des incompatibilités inévitables entre version majeure.
Sinon ta fonction digamme, tu vas l'implanter via une user function (Forme non évaluée). Tu l'évalues en faisant un remplacement à l'aide d'un gros dictionnaire (qui contient toutes les variables globales, les fonctions que l'utilisateur à fait, ..) que tu appliqueras via may_subs.
Or may_subs supporte les fonctions internes. Donc ce qui se passera est que lors de la nouvelle version (majeure), digamma sera simplifiée par MAY, puis s'il reste sous forme non évaluée, ton propre évaluateur sera appelé. Ce qui fera beaucoup de dégat

Ou alors tu as implanté ta fonction via une extension (une classe regroupant plein de fonctions supplémentaires serait parfait) et de manière interne, ca ne changerait pas. Ensuite tout dépendrait du parsing et de comment tu amènes ta fonction digamma... Il serait bien que l'on puisse surcharger au moment du parsing les fonctions internes pour retourner des extensions. Mais ca complique le code, et le parseur !

D'un autre coté, je n'ai pas fini de spécifier comme les extensions modifient le parsing. Et pour faire ce que je veux, ce n'est pas simple

Pollux (./26) :
Est-ce que ça veut dire que par exemple si sin(2*x)+y est réécrit en y+sin(2*x) et que sin(2*a)+sin(sin(b)) est réécrit en sin(sin(b))+sin(2*a), alors sin(2*a)+sin(sin(b)) ne sera pas de la forme sin(2*$1)+$2, ou est-ce que le matching prend en compte la commutativité ?
Le matching prend en compte la commutativité. Par exemple, x matche x*$1+$2 aussi

C'est pour çà qu'il interdit d'avoir 'x+$2+$3' comme expression.
Pollux (./26) :
Tu ne spécifies pas la priorité des types de base ?
Un type de base est pris en compte de suite (priorité 0).
Faudrait peut être le préciser plus dans la doc.
Pollux (./26) :
Ce serait pas plus intéressant de mettre genre 100/200/300/400, pour qu'on puisse définir des extensions de priorité intermédiaire ? Et tu n'as pas une priorité encore supérieure pour les opérateurs unaires ?
Tu confonds la priorité des opérateurs et la priorité des extensions, qui sont 2 priorité différentes (La priorité des extensions n'intervient pas dans le parsing, et inversement).
Pollux (./26) :
- Tu ne précises pas si on peut appeler plusieurs fois put_string (j'imagine que oui ?)
Oui. Faut-il vraiment le précisier ?
Pollux (./26) :
- Ce serait pas plus logique d'appeler convert() put_may() ? Y a pas besoin de passer put_string pour que ça soit réentrant ? Et pourquoi "ext" s'appelle comme ça, il peut avoir un type quelconque et pas seulement un type de l'extension ? Ou alors j'ai rien compris ?
1. Je ne pense pas. Mais je suis ouvert.
2. Non. En fait put_string est une fonction interne que je ne veux pas exporter directement, mais qui est nécessaire.
3. Type quelconque. Ca n'aurait pas beaucoup de sens de faire un put_string de l'extension, car on partirait en boucle infini

Pollux (./26) :
mme façon de savoir si la classe vérifie un prédicat, ça veut dire que c'est impossible de linker ensemble deux modules qui ont été compilés avec des versions différentes de maylib (alors que si tu veux t'en servir comme CAS sur calculatrice la compatibilité binaire est super importante). Pourquoi pas utiliser à la place un champ avec des flags genre ASSERT_COMMUTATIVE_PRODUCT ? Comme ça tu pourras en rajouter d'autres quand t'en auras besoin...
MAYLIB est une librairie de bas niveau. Il me parait impensable de linker deux modules linkées avec des versions différentes de may et d'espérer que ca marche.
Mais si tu penses que c'est nécessaire, je peux ajouter un check pour rejeter toute tentative d'enregistrement si la version de lib est différente entre le .h et le .a.
PS: N'oublies pas que MAYLIB est une bibliothèque. Il reste à faire le langage, les fonctions de haut niveau, l'enrobage, et toute l'interface utilisateur.