Discussion:
Arguments des fonctions au comportement bizarre(?)
Samuel Amo
2010-06-01 12:51:28 UTC
Permalink
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
Samuel Amo
2010-06-01 13:52:54 UTC
Permalink
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
A la difference de la plupart des langages modernes, Maxima utilise les
portées dynamiques, non pas lexicales.
-s
Post by Samuel Amo
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
https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr
Stavros Macrakis
2010-06-01 16:33:21 UTC
Permalink
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
Post by Samuel Amo
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
A la difference de la plupart des langages modernes, Maxima utilise les
portées dynamiques, non pas lexicales.
-s
Post by Samuel Amo
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
https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr
Samuel Amo
2010-06-03 16:07:55 UTC
Permalink
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
Post by Stavros Macrakis
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
Post by Samuel Amo
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
A la difference de la plupart des langages modernes, Maxima utilise les
portées dynamiques, non pas lexicales.
-s
Post by Samuel Amo
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
https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr
Stavros Macrakis
2010-06-01 13:32:00 UTC
Permalink
A la difference de la plupart des langages modernes, Maxima utilise les
portées dynamiques, non pas lexicales.

-s
Post by Samuel Amo
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
https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr
Loading...