如何在Mathematica中转义@符号?

3

背景:

在面向对象的系统中,格式为

  object.method[var] 

is

  object@method[var]

基本上点变成了字母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保持未计算状态,表达式本身也没有被计算。

如何在这种情况下“转义”@符号?


你是否打算将 @ 用作除了 前缀 以外的其他内容? - user616736
什么是面向对象系统?您打算如何使用结果?当您将"a@new[b]"作为字符串获取时,您希望评估的下一步是什么?也就是说,您希望mma对a@new[b]做什么?评估b但不对@做任何操作? - acl
OO-System是一个开源软件包,它将面向对象编程范式添加到Mathematica中。 - nilo de roock
1个回答

7
你应该意识到@是单个方括号的快捷方式(更准确地说,是构建表达式的前缀形式),因此在实际情况下,只要代码字符串被解析为mma解析器(我怀疑此时输入表达式的信息 - 如a@xa[x]x//a已经不可逆地丢失),a@x就相当于a[x]。唯一改变事物运作方式的方法是编写预处理器或使用类似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];

因此,您可能会遇到一些符号上的不便,但是代码应该不管您如何输入都能正常工作 - 如a@new[b]a[new[b]]。如果您想将后者转换为前者以供演示目的,则我唯一看到的方法是编写自己的mma解析器/后处理器,将一些a[x]转换为a@x,而其他部分则不转换。不过这并不容易,因为它应该知道哪些部分需要转换,哪些部分不需要。而且,我不会像您概述的那样使用字符串转换 - 您需要类似于对ToExpression的调用才能使其评估等等。
所以,底线是:您遇到了一种符号上的但不是语义上的差异,这被选择为引入方便的符号的简单方式,由OO-System的作者选择。这种方法是合法的,但是您应该记住,它只是在mma解析器之上提供了一些语法糖,而该解析器不受您直接控制,并且自动将a@x转换为a[x]只是可能发生的事情之一。您可以接受这一点,或者使用不同的更健壮的符号,例如通过UpValues Dot函数重载的符号,这是另一种流行的mma OO扩展选择。

再次对您在MMa方面的知识印象深刻,感谢。只要事情能够正常运行,我可以容忍不便。;-) - nilo de roock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接