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

Ale*_*kov 8 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}
Run Code Online (Sandbox Code Playgroud)

Ale*_*kov 7

OwnValues[a] = {HoldPattern[a] -> 3}; OwnValues[a]给人{HoldPattern[a] :> 3}的不是{HoldPattern[a] -> 3},但Definition[a]说明了什么谁也无法预料.大概该定义存储在内部的形式Rule,但被转换成RuleDelayedOwnValues该定义的RHS的评价抑制.这个假设与我最初的理解相矛盾,即由Set和分配的值之间没有差异SetDelayed.也许这样的定义存储在不同的形式:RuleRuleDelayed相应而是从视评估的角度相等.

有趣的是看到如何MemoryInUse[]取决于定义的类型.

在下面的实验中,我在没有FrontEnd的交互式会话中使用了Mathematica 5.2 的内核.使用Mathematica 6和7 的内核,将获得不同的结果.其中一个原因是默认情况下这些版本Set会过载.

首先我评价$HistoryLength=0;具有DownValues用于InOut变量不影响我的结果.但似乎即使$HistoryLength设置为0 In[$Line],当前输入行的值仍然存储并在输入新输入后删除.这可能是第一次评估的结果MemoryInUse[]总是与第二次评估不同的原因.

这是我得到的:

适用于学生的Mathematica 5.2:Microsoft Windows版本

版权所有1988-2005 Wolfram Research,Inc.

- 初始化终端图形 -

在[1]中:= $ HistoryLength = 0;

在[2]中:= MemoryInUse []

出[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

可以看出,定义a=2;增加MemoryInUse[]了1986824-1986760 = 64字节.用定义替换它a:=2;增加MemoryInUse[]1986952-1986824 = 128字节.用前者替换后一个定义将恢复MemoryInUse[]为1986824字节.这意味着延迟定义比立即定义需要128个字节.

当然,这个实验并不能证明我的假设.


Mr.*_*ard 3

Information调用,并且(或)Definition上的跟踪没有显示任何内容。我必须假设这是一个访问表外部数据的低级函数。也许它保留了当时解析的原始定义表达式的副本。DefinitionFullDefinition*Values