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}发布于 2011-05-07 19:16:27
OwnValues[a] = {HoldPattern[a] -> 3}; OwnValues[a]给出了{HoldPattern[a] :> 3}而不是{HoldPattern[a] -> 3},但Definition[a]展示了人们可以期待的东西。该定义可能在内部以Rule的形式存储,但是为了抑制对该定义的r.h.s的求值,OwnValues将其转换为RuleDelayed。这一假设与我最初的理解相矛盾,即Set和SetDelayed赋值之间没有区别。这些定义可能以不同的形式存储:相应的Rule和RuleDelayed,但从评估者的角度来看是等价的。
有趣的是,MemoryInUse[]是如何依赖于这种定义的。
在接下来的实验中,我在没有FrontEnd的情况下,在交互会话中使用了Mathematica 5.2内核。使用Mathematica 6和7的内核会得到不同的结果。其中一个原因是in these versions Set is overloaded by default。
首先,我对$HistoryLength=0;进行了评估,因为它让In和Out变量的DownValues不影响我的结果。但似乎即使当$HistoryLength设置为0时,current输入行的In[$Line]的值在输入新输入后仍然会被存储和删除。这可能是为什么MemoryInUse[]的第一次评估结果总是与第二次评估结果不同的原因。
下面是我得到的信息:
适用于学生的
Mathematica5.2:微软视窗版本
版权所有1988-2005 Wolfram Research,Inc.
--终端图形初始化--
In1:= $HistoryLength=0;
In2:= MemoryInUse[]
Out2= 1986704
In3:= MemoryInUse[]
Out3= 1986760
In4:= MemoryInUse[]
Out4= 1986760
In5:= a=2;
In6:= MemoryInUse[]
Out6= 1986848
In7:= MemoryInUse[]
Out7= 1986824
In8:= MemoryInUse[]
Out8= 1986824
In9:= a:=2;
In10:= MemoryInUse[]
Out10= 1986976
In11:= MemoryInUse[]
Out11= 1986952
In12:= MemoryInUse[]
Out12= 1986952
In13:= a=2;
In14:= MemoryInUse[]
Out14= 1986848
In15:= MemoryInUse[]
Out15= 1986824
In16:= MemoryInUse[]
Out16= 1986824
可以看到,定义a=2;会使MemoryInUse[]增加1986824-1986760=64字节。将其替换为定义a:=2;将使MemoryInUse[]增加1986952-1986824=128千字节。并且用前一种定义替换后一种定义将MemoryInUse[]恢复到1986824字节。这意味着延迟定义比立即定义多需要128个字节。
当然,这个实验并不能证明我的假设。
发布于 2014-01-08 18:50:17
符号的完整定义可以通过未记录的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。请注意,D12采用ExcludedContexts选项,而Language`ExtendedDefinition不采用。”
发布于 2011-05-07 14:14:58
Information调用Definition,而Definition (或FullDefinition)上的跟踪不显示任何内容。我必须假设这是一个低级函数,用于访问*Values表之外的数据。也许它保留了当时解析的原始定义表达式的副本。
https://stackoverflow.com/questions/5919284
复制相似问题