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仍然没有评估,因此也没有评估表达式.
你应该认识到的@是单一的方括号的快捷方式(更准确地说,建立一个表达式的前缀形式),所以所有的实际目的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@x到a[x]仅仅是一个事情可能发生的体现.您可以使用它,也可以使用不同的更强大的表示法,例如通过UpValues Dot函数重载,这是mma OO扩展的另一个流行选择.
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |