关于符号定义和价值的问题

时间:2011-05-07 05:17:38

标签: wolfram-mathematica

Definition“知道”如何定义符号的值:使用SetSetDelayed。但是怎么样?据我所知,在分配了符号的值之后,评估者的分配方式没有任何区别:使用SetSetDelayed。它可以通过函数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}

3 个答案:

答案 0 :(得分:7)

OwnValues[a] = {HoldPattern[a] -> 3}; OwnValues[a]代替{HoldPattern[a] :> 3}代替{HoldPattern[a] -> 3}Definition[a]显示了人们可以期待的内容。该定义可能在内部以Rule的形式存储,但由RuleDelayed转换为OwnValues,以抑制对定义的r.h.s的评估。这个假设与我最初的理解相矛盾,即SetSetDelayed分配的值之间没有差异。这些定义可能会以不同的形式存储:RuleRuleDelayed,但从评估者的角度来看是等价的。

有趣的是看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`ExtendedDefinitionLanguage`ExtendedFullDefinition访问符号的完整定义。引用Oleksandr Rasputinov

“如果有人好奇,Language`ExtendedDefinitionLanguage`ExtendedFullDefinition类似于DefinitionFullDefinition,但会捕捉符号的定义,因为它可以被复制在另一个内核中。例如,defs = Language`ExtendedFullDefinition[sym]返回一个Language`DefinitionList对象。用于恢复定义的语法非常不规则:Language`ExtendedFullDefinition[] = defs,其中defsLanguage`DefinitionList请注意,Language`ExtendedFullDefinition采用ExcludedContexts选项而Language`ExtendedDefinition没有。“

答案 2 :(得分:3)

Information调用DefinitionDefinition(或FullDefinition)上的跟踪不显示任何内容。我必须假设这是一个访问*Values表之外的数据的低级函数。也许它保留了原始定义表达式的副本,因为它们在那时被解析了。