DownValues, UpValues, SubValues, 和OwnValues之间的区别?
原链接:在这里
-------------------------------------------------------------------------------------------------
首先我们要知道,在Mma中,所有的功能其实都是各种各样的模式(patterns)的体现而已.
让我们从 OwnValues
开始, 这种模式类型就是你在其他编程语言里学到的所谓"变量". 正如它字面上的意思所表示的:一个符号的OwnValues就是这个符号本身所代表的值.
In[1] := a = 2; OwnValues[a]
Out[1] := {HoldPattern[a] :> 2}
在绝大部分情况下, 当一个符号被定义为函数的时候, 我们就不知不觉用到了DownValue
. 此时, 这个符号本身没有任何意义除非在后面跟上合适的参数.
f[x_] := x^2
上面的式子定义了一个模式---每当形如f[blala]的表达式出现时就将其替换为blala^2. 仅仅有一个f是毫无意义的.
In[2] := f
Out[2] := f
然而, 每当遇到一个下行值(就是表达式结构的下一层的值,比如在f[b]中,b就在f的下一层),模式就被应用了:
In[3] := f[b]
Out[3] := b^2
可以用下面的方法查看上面生成的模式:
In[4] := DownValues[f]
Out[4] := {HoldPattern[f[x_]] :> x^2}
下面来说UpValues
.有时,把规格和外层的符号联系起来是很方便的.例如,定义一个符号c:当这个符号的下标是1时它的值为2.这个规则可以用如下代码定义:
c /: Subscript[c, 1] := 2
In[5] := UpValues[c]
Out[5] := {HoldPattern[Subscript[c, 1]] :> 2}
最后是SubValues,用于下面这种类型的定义:
d[e][f] = x;
In[6] := SubValues[d]
Out[6] := {HoldPattern[d[e][f]] :> x}
(这个不重要,请忽略吧)