如何逃离Mathematica中的@?

时间:2011-07-13 11:24:14

标签: wolfram-mathematica

背景:

在OO-System中的格式为

  object.method[var] 

  object@method[var]

基本上dot变为alpha。

我正在生成(XML回到)代码。

问题:

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

按预期工作。

现在我要改变

   a

  a@new[b]

具有以下(不需要的)结果(因为@在Mathematica中保留)

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

虽然

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

似乎可以解决问题,现在b仍然没有评估,因此也不会评估表达式。

在这种情况下如何“逃避”@?

1 个答案:

答案 0 :(得分:7)

您应该意识到@是单个方括号的快捷方式(更准确地说,是构建表达式的前缀形式),因此对于所有实际用途a@x等同于{{1}一旦mma解析器解析了代码串(我怀疑此时,关于如何输入表达式的信息 - a[x]a@x或{{1} },不可逆转地丢失了)。使事情以不同方式工作的唯一方法是编写预处理器,或使用Notation包之类的东西。但是,这不是在OO-System中所做的。快速浏览一下它的实现情况:

a[x]

所以,你得到的可能是一个符号上的不便,但无论你如何输入代码,代码都应该有用 - x//a (*** Invocation of Class Mathods ***) xc_Class @ yo1_ := objectallg[xc] @ Hold[yo1]; (*** Invocation of Instance Methods ***) xo_MathObject @ yo1_ := objectallg[xo] @ Hold[yo1]; 。如果你想将后者转换为前者用于演示目的,那么我看到的唯一方法就是编写你自己的mma解析器/后处理器来将一些a@new[b]转换为a[new[b]]]而不是其他人。但这并不容易,因为它应该知道要转换哪个部分以及哪个部分不能转换。并且我不会以您概述的方式使用字符串转换 - 您需要调用a[x]来进行评估。等

所以,底线:你遇到了一个符号但没有语义差异的情况,这被选为一种简单的方法来引入OO-System的作者的方便符号。这种方法是合法的,但你应该记住,它只是在你的直接控制之外的mma解析器上提供了语法糖,并且a@xToExpression的自动转换只是一种表现形式可能发生的事情。您可以使用它,也可以使用不同的更强大的表示法,例如通过a@x a[x]函数重载,这是mma OO扩展的另一种流行选择。