Réutiliser la variable locale dans la déclaration en dedans Avec


2

Considérant la richesse de Mathematica.SE, je suis assez surpris de ne pas trouver ma réponse ... Je suis vraiment désolé si c'est un doublon.

Prenons l'exemple suivant:

With[{t1=0,t2=t1},t1+t2] (* -> t1 *) 

Je pensais que ce serait imprimer 0 au lieu de t1.

En effet, un Trace donne:

[email protected][{t1 = 0, t2 = t1}, t1 + t2] 
(* {With[{t1=0,t2=t1},t1+t2],0+t1,t1} *) 

t1 reste non évaluée.

Compte tenu de l'utilisation complexe de maintien et de tels attributs pour un débutant Mathematica comme moi et le documentation qui indique With a attribuer HoldAll, j'ai essayé d'insérer Evaluate à divers endroits, et aussi essayé de remplacer With par Module (je l'avoue la différence entre With et Module n'est pas évident pour moi), mais rien ne m'a imprimé 0 au lieu de t1.

Comment puis-je informer Mathematica d'évaluer t2=t1 avec t1 et t2 déclarée dans With?

Modifier: Grâce aux premiers commentaires et réponses, quelques questions et réponses utiles et étroitement liées peuvent être trouvées here.

  0

Il y a vraiment de bonnes explications de portée lexicale et dynamique [ici] (http://stackoverflow.com/questions/6236458/plot-using-with-versus-plot -using-block-mathematica/6236808 # 6236808) et [ici] (http://mathematica.stackexchange.com/questions/559/what-are-the-use-cases-for-different-scoping-constructs). Dans votre exemple, vous pouvez imbriquer deux 'With's si vous ne voulez pas essayer' Block': 'Avec [{t1 = 0}, Avec [{t2 = t1}, (t1 + t2)]]' 27 août. 132013-08-27 10:21:27

  0

C'est bien connu. C'est ainsi que Mathematica fonctionne. rien de nouveau. Essayez 'Module [{x = 0, y = x}, Imprimer [y]]' et il affichera 'x' et non' 0'. Mathematica ne met pas à jour les paramètres «à la volée». Par conséquent, il n'utilise pas la valeur mise à jour qui vient d'être attribuée. C'est comme ça depuis toujours. 27 août. 132013-08-27 10:24:03

+1

La règle empirique que j'utilise, pour ne pas me tromper comme ça, (en pensant que je mets une variable à une certaine valeur, mais ce n'est pas le cas), est de ne jamais utiliser p1 = p2 dans les variables locales liste. Si vous devez régler 'p2' sur' p1', faites-le après la liste des paramètres, ici -> 'Module [{p1 = 0, p2}, p2 = p1 ....]' Vous devez juste vous en souvenir. 27 août. 132013-08-27 10:37:44

  0

@SimonWoods ce n'est pas exactement la même question que certaines personnes doivent connaître la réponse de celui-ci: "Nest votre' With' "avant de lire ceci * très intéressant * q/a vous référez à. En fait, je lisais celui-ci pendant que vous commentiez. 27 août. 132013-08-27 13:14:52

  0

@Nasser Merci, je vais utiliser votre avis dès maintenant. Ne pensez-vous pas qu'il vaut la peine de le mettre comme une réponse afin que je puisse fermer la question? 27 août. 132013-08-27 13:17:51

2

LetL faites exactement ce que vous voulez. Vous pouvez voir la mise en œuvre here.

LetL[{t1 = 0, t2 = t1}, t1 + t2] 
  0

Comment utiliser 'LetL' pour' With' et 'Module'? 'Module [{LetL [{a = 1, b = a + 1, c = a + b + 2}, {a, b, c}]}, Imprimer [a]; ] 'n'a pas fonctionné, et' Module [LetL [{a = 1, b = a + 1, c = a + b + 2}, {a, b, c}], Imprimer [a]; ] 'n'a pas fonctionné. Y a-t-il une syntaxe différente à utiliser?La question est de savoir comment l'utiliser dans le contexte de 'With' et' Module', donc je suppose que l'on peut faire cela, je ne peux pas comprendre la syntaxe :) 27 août. 132013-08-27 12:19:13

  0

@Nasser quels sont les 'Attributs' de' Module' ? Là réside votre réponse. : P 27 août. 132013-08-27 13:27:36