如何逃离Mathematica中的@?

nil*_*ock 3 wolfram-mathematica

背景:

在OO-System中的格式

  object.method[var] 
Run Code Online (Sandbox Code Playgroud)

  object@method[var]
Run Code Online (Sandbox Code Playgroud)

基本上dot变成了alpha.

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

题:

  In[22]:= a /. a -> b
  Out[22]= b
Run Code Online (Sandbox Code Playgroud)

按预期工作.

现在我想改变

   a
Run Code Online (Sandbox Code Playgroud)

  a@new[b]
Run Code Online (Sandbox Code Playgroud)

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

  In[23]:= a /. a -> a@new[b]
  Out[23]= a[new[b]]
Run Code Online (Sandbox Code Playgroud)

虽然

  In[25]:= a /. a -> "a@new[b]]"
  Out[25]= "a@new[b]]"
Run Code Online (Sandbox Code Playgroud)

似乎可以做到这一点,现在b仍然没有评估,因此也没有评估表达式.

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

Leo*_*rin 7

你应该认识到的@是单一的方括号的快捷方式(更准确地说,建立一个表达式的前缀形式),所以所有的实际目的a@x是相当于a[x],只要串码是由MMA解析器解析(和我怀疑,在这个时刻,对表达如何输入的信息-作为a@x,a[x]或者x//a,是irreversably丢失).使事情以不同方式工作的唯一方法是编写预处理器,或使用Notation包之类的东西.但是,这不是在OO-System中所做的.快速浏览一下它的实现情况:

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

所以,你得到的可能是一个符号上的不便,但无论你如何输入代码,代码都应该有效 - 无论是作为a@new[b]还是作为a[new[b]]].如果你想将后者转换为前者用于演示目的,那么我看到的唯一方法是编写自己的mma解析器/后处理器来将一些转换a[x]a@x其他而不是其他.但这并不容易,因为它应该知道要转换哪个部分以及哪个部分不能转换.我不会以你概述的方式使用字符串转换 - 你需要像调用ToExpression它来评估它.等等

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