Wolfram mathematica 如何在Mathematica中逃离@?

Wolfram mathematica 如何在Mathematica中逃离@?,wolfram-mathematica,Wolfram Mathematica,背景: 在OO系统中 object.method[var] 是 基本上点变成了α 我正在生成(XML返回)代码 问题: 一切正常 现在我想改变 a 进入 它有以下(不需要的)结果(因为@在Mathematica中是保留的) 虽然 In[25]:= a /. a -> "a@new[b]]" Out[25]= "a@new[b]]" 似乎做到了这一点,现在b仍然未计算,表达式本身也未计算 在这种情况下如何“转义”?您应该意识到,@是单方括号的快捷方式(更准确地说,是

背景:

在OO系统中

  object.method[var] 

基本上点变成了α

我正在生成(XML返回)代码

问题: 一切正常

现在我想改变

   a
进入

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

虽然

  In[25]:= a /. a -> "a@new[b]]"
  Out[25]= "a@new[b]]"
似乎做到了这一点,现在b仍然未计算,表达式本身也未计算


在这种情况下如何“转义”?您应该意识到,
@
是单方括号的快捷方式(更准确地说,是构建表达式的前缀形式),因此在所有实际用途中
a@x
相当于
a[x]
,只要mma解析器解析了代码字符串(我怀疑此时,关于表达式是如何输入的信息-作为
a@x
a[x]
x//a
,不可逆转地丢失)。使事情以不同方式工作的唯一方法是编写预处理器,或使用类似于符号包的东西。但是,这不是OO系统中所做的。快速查看其实现可以发现:

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


因此,底线是:您遇到了一个符号而非语义差异的情况,OO系统的作者选择了这种方法作为一种简单的方法来引入一种方便的符号。这种方法是合法的,但您应该记住,它只会在mma解析器上提供语法上的糖分,而mma解析器是您无法直接控制的
a@x
a[x]
只是可能发生的事情的一种表现形式。您可以接受这种情况,也可以使用不同的更健壮的表示法,例如通过
UpValues
Dot
函数重载,这是mma OO扩展的另一种流行选择。

您打算将
@
用作
前缀以外的东西吗s OO系统?您打算如何处理结果?当您获得“a@new[b] “作为一个字符串,您希望评估的下一步是什么?即,您希望mma如何处理a@new[乙]?评估b但对@?OO系统不做任何事?OO系统是一个开源软件包,它将OOP范例添加到Mathematica中。再次被您对MMa的了解所打动,谢谢。-只要一切正常,我可以忍受不便。;-)
  a@new[b]
  In[23]:= a /. a -> a@new[b]
  Out[23]= a[new[b]]
  In[25]:= a /. a -> "a@new[b]]"
  Out[25]= "a@new[b]]"
 (*** Invocation of Class Mathods ***)
 xc_Class @ yo1_ := objectallg[xc] @ Hold[yo1];
 (*** Invocation of Instance Methods ***)
 xo_MathObject @ yo1_ := objectallg[xo] @ Hold[yo1];