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 <[email protected]>

> 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 <[email protected]>
>
>> 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 <[email protected]>
>>
>> A la difference de la plupart des langages modernes, Maxima utilise les
>>> portées dynamiques, non pas lexicales.
>>>
>>>             -s
>>>
>>> 2010/6/1 Samuel Amo <[email protected]>
>>>
>>>> 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
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr
>>>>
>>>>
>>>
>>
>
------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Maxima-lang-fr mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/maxima-lang-fr

Répondre à