Definition
“知道”如何定义符号的值:使用Set
或SetDelayed
。但是怎么样?据我所知,在分配了符号的值之后,评估者的分配方式没有任何区别:使用Set
或SetDelayed
。它可以通过函数OwnValues
来说明,它始终返回Head
RuleDelayed
的定义。 Definiton
如何获取此信息?
In[1]:= a=5;b:=5;
Definition[a]
Definition[b]
OwnValues[a]
Out[2]= a=5
Out[3]= b:=5
Out[4]= {HoldPattern[a]:>5}
答案 0 :(得分:7)
OwnValues[a] = {HoldPattern[a] -> 3}; OwnValues[a]
代替{HoldPattern[a] :> 3}
代替{HoldPattern[a] -> 3}
但Definition[a]
显示了人们可以期待的内容。该定义可能在内部以Rule
的形式存储,但由RuleDelayed
转换为OwnValues
,以抑制对定义的r.h.s的评估。这个假设与我最初的理解相矛盾,即Set
和SetDelayed
分配的值之间没有差异。这些定义可能会以不同的形式存储:Rule
和RuleDelayed
,但从评估者的角度来看是等价的。
有趣的是看MemoryInUse[]
取决于定义的类型。
在下面的实验中,我在没有FrontEnd的交互式会话中使用了 Mathematica 5.2的内核。使用 Mathematica 6和7的内核,将获得不同的结果。其中一个原因是in these versions Set
is overloaded by default。
首先,我评估$HistoryLength=0;
DownValues
In
变量Out
和$HistoryLength
变量不会影响我的结果。但似乎即使In[$Line]
设置为0,当前输入行的MemoryInUse[]
值仍会在输入新输入后存储并删除。这可能是a=2;
的第一次评估结果总是与第二次评估不同的原因。
这是我所拥有的:
Mathematica 5.2 for Students:Microsoft Windows Version
版权所有1988-2005 Wolfram Research,Inc。
- 初始化终端图形 -
在[1]中:= $ HistoryLength = 0;
在[2]中:= MemoryInUse []
Out [2] = 1986704
在[3]中:= MemoryInUse []
Out [3] = 1986760
在[4]中:= MemoryInUse []
Out [4] = 1986760
在[5]中:= a = 2;
在[6]中:= MemoryInUse []
Out [6] = 1986848
在[7]中:= MemoryInUse []
Out [7] = 1986824
在[8]中:= MemoryInUse []
Out [8] = 1986824
在[9]中:= a:= 2;
在[10]中:= MemoryInUse []
Out [10] = 1986976
在[11]中:= MemoryInUse []
Out [11] = 1986952
在[12]中:= MemoryInUse []
Out [12] = 1986952
在[13]中:= a = 2;
在[14]中:= MemoryInUse []
Out [14] = 1986848
在[15]中:= MemoryInUse []
Out [15] = 1986824
在[16]中:= MemoryInUse []
Out [16] = 1986824
可以看出,定义MemoryInUse[]
增加a:=2;
到1986824-1986760 = 64字节。用定义MemoryInUse[]
替换它会使MemoryInUse[]
增加1986952-1986824 = 128字节。用前者替换后一个定义将{{1}}恢复为1986824字节。这意味着延迟定义比立即定义需要128个字节。
当然,这个实验并不能证明我的假设。
答案 1 :(得分:4)
可以通过未记录的8合作符号Language`ExtendedDefinition
和Language`ExtendedFullDefinition
访问符号的完整定义。引用Oleksandr Rasputinov:
“如果有人好奇,Language`ExtendedDefinition
和Language`ExtendedFullDefinition
类似于Definition
和FullDefinition
,但会捕捉符号的定义,因为它可以被复制在另一个内核中。例如,defs = Language`ExtendedFullDefinition[sym]
返回一个Language`DefinitionList
对象。用于恢复定义的语法非常不规则:Language`ExtendedFullDefinition[] = defs
,其中defs
是Language`DefinitionList
请注意,Language`ExtendedFullDefinition
采用ExcludedContexts
选项而Language`ExtendedDefinition
没有。“
答案 2 :(得分:3)
Information
调用Definition
,Definition
(或FullDefinition
)上的跟踪不显示任何内容。我必须假设这是一个访问*Values
表之外的数据的低级函数。也许它保留了原始定义表达式的副本,因为它们在那时被解析了。