Le principe était de construire des fonctions dont les arguments soient de véritables variables muettes non polluées par l'extérieur.
Par exemple f(x):=diff(x*s,s);
ne devrait pas être pollué si je fais f(s) (je veux que cela renvoie s et non 2s ...)
J'ai trouvé une solution en traffiquant un nouvel opérateur d'affectation, je n'ose pas montrer le code tellement c'est moche.

Mais en ce moment je me bats avec maxima pour une raison différente : j'aimerais écrire une fonction write_fundef(f,file) qui écrit string(fundef(f)) dans file. Ceci pour stocker des définitions simplifiées qui ont pris du temps de calcul.
Le problème est que lorsque j'écris cela maxima essaie d'appliquer tout-de-suite fundef a "f" sans prendre la peine de remplacer f par sa valeur lors de l'appel de write_fundef.
Je pense essayer de bidouiller avec des tellsimp et Cie, mais ça me semble bien tordu...

N'y a-t'il pas des moyens plus simples ?


Samuel Amo

2010/6/2 Stavros Macrakis <macrakis@alum.mit.edu>
La première question a se poser est: pourquoi utiliser 'ev' (la fonction-poubelle de Maxima)?  En général, c'est plus simple et plus clair d'utiliser 'subst'.

Ceci dit, ça n'aide pas si effectivement vous voulez évaluer les valeurs de fonctions que vous avez définies.

Qu'est-ce que vous voulez faire avec votre fonction?  L'exemple de 'patate' ne montre pas la motivation et le contexte du problème...


              -s

2010/6/1 Samuel Amo <samuel.amo@gmail.com>
Merci beaucoup pour votre réponse.
En effet je ne suis pas habitué à manipuler les portées dynamiques.
Je viens de comprendre que, lorsque je rentre les lignes

patate(x,y):=ev(args(__)[2],eval)$
patate(f(x),x);

Maxima pose patate(x=f(x),y=x)
alors effectivement je comprends pourquoi il renvoie f(f(x)), avec l'effet de l'option eval qui demande deux évaluations successives...

Cela m'oblige à nommer les variables de mes fonctions avec des noms compliqués, pour être certain que je ne les rencontrerai pas plus loin dans le programme, mais cela nuit à la lisibilité du code.

N'y a-t-il pas une astuce qui permet de contourner ce problème ?

Cordialement,

Samuel Amo

2010/6/1 Stavros Macrakis <macrakis@alum.mit.edu>

A la difference de la plupart des langages modernes, Maxima utilise les portées dynamiques, non pas lexicales.

            -s

2010/6/1 Samuel Amo <samuel.amo@gmail.com>
Bonjour,

je voudrais savoir s'il est normal que lorsque je tape

patate(x,y):=ev(args(__)[2],eval)$
patate(f(x),x);
 
cela renvoie f(f(x))  ??

Je m'attendrais (et j'attendais !) que cela me renvoie x, ou son évaluation.
(Mais en l'occurence x ne contenait aucune valeur ni fonction.)

Par contre le probleme semble disparaitre si je tape

patate(u,y):=ev(args(__)[2],eval)$
patate(f(x),x);

(cela renvoie bien x)

N'est-ce pas révélateur d'un bug de localité de la variable ??
Il est plus probable qu'il y a quelque chose que je n'ai pas compris dans le système maxima
(je m'y suis mis il y a seulement quelques mois).
Quelqu'un pourrait-il m'éclairer ?

Cordialement,

Samuel Amo

------------------------------------------------------------------------------


_______________________________________________
Maxima-lang-fr mailing list
Maxima-lang-fr@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr