背景:
在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仍然没有评估,因此也不会评估表达式。
答案 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@x
到ToExpression
的自动转换只是一种表现形式可能发生的事情。您可以使用它,也可以使用不同的更强大的表示法,例如通过a@x
a[x]
函数重载,这是mma OO扩展的另一种流行选择。