3 votes

Comment échapper à @ dans Mathematica ?

Contexte :

Dans le système OO, le format de

  object.method[var] 

est

  object@method[var]

En principe, le point devient alpha.

Je génère du code ("XML back to").

Question :

  In[22]:= a /. a -> b
  Out[22]= b

fonctionne comme prévu.

Maintenant, je veux changer

   a

en

  a@new[b]

ce qui donne le résultat suivant (non désiré), puisque @ est réservé dans Mathematica

  In[23]:= a /. a -> a@new[b]
  Out[23]= a[new[b]]

bien que

  In[25]:= a /. a -> "a@new[b]]"
  Out[25]= "a@new[b]]"

semble faire l'affaire, maintenant b reste non évalué et l'expression en tant que telle n'est pas évaluée non plus.

Comment échapper à @ dans ce cas ?

7voto

Leonid Shifrin Points 19822

Il faut savoir que le @ est un raccourci pour les crochets simples (plus précisément, une forme de préfixe pour construire une expression). a@x est équivalent à a[x] Dès que la chaîne de code est analysée par l'analyseur mma (et je soupçonne qu'à ce moment-là, l'information sur la façon dont l'expression a été saisie - en tant que a@x , a[x] o x//a est irrémédiablement perdue). Le seul moyen de faire fonctionner les choses différemment serait d'écrire un pré-processeur, ou d'utiliser quelque chose comme le paquet Notation. Cependant, ce n'est pas ce qui a été fait dans OO-System. Un rapide coup d'œil à son implémentation permet de s'en rendre compte :

 (*** Invocation of Class Mathods ***)
 xc_Class @ yo1_ := objectallg[xc] @ Hold[yo1];
 (*** Invocation of Instance Methods ***)
 xo_MathObject @ yo1_ := objectallg[xo] @ Hold[yo1];

Il s'agit donc d'un inconvénient au niveau de la notation, mais le code devrait fonctionner quelle que soit la manière dont vous l'entrez - comme a@new[b] ou comme a[new[b]]] . Si vous souhaitez convertir le second en premier à des fins de présentation, le seul moyen que je vois est d'écrire votre propre analyseur syntaxique/postprocesseur mma pour convertir quelques a[x] à a@x mais pas d'autres. Mais ce ne sera pas facile, car il faut savoir quelle partie doit être convertie et laquelle ne doit pas l'être. Et je n'utiliserais pas la conversion de chaînes de caractères de la manière que vous avez décrite - vous auriez besoin de quelque chose comme des appels à ToExpression pour l'évaluer. etc.

En résumé, vous avez rencontré un cas de différence notationnelle mais non sémantique, qui a été choisi par l'auteur d'OO-System comme un moyen facile d'introduire une notation pratique. L'approche est légitime, mais vous devez garder à l'esprit qu'elle ne vous donne que du sucre syntaxique en plus de l'analyseur syntaxique mma qui est hors de votre contrôle direct, et de la conversion automatique de a@x à a[x] n'est qu'une manifestation des choses qui peuvent se produire. Vous pouvez soit vous en accommoder, soit utiliser une autre notation plus robuste, telle que la surcharge via UpValues Dot qui est un autre choix populaire pour les extensions OO de mma.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X