Ale*_*kov 8 wolfram-mathematica
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}
Run Code Online (Sandbox Code Playgroud)
OwnValues[a] = {HoldPattern[a] -> 3}; OwnValues[a]给人{HoldPattern[a] :> 3}的不是{HoldPattern[a] -> 3},但Definition[a]说明了什么谁也无法预料.大概该定义存储在内部的形式Rule,但被转换成RuleDelayed由OwnValues该定义的RHS的评价抑制.这个假设与我最初的理解相矛盾,即由Set和分配的值之间没有差异SetDelayed.也许这样的定义存储在不同的形式:Rule和RuleDelayed相应而是从视评估的角度相等.
有趣的是看到如何MemoryInUse[]取决于定义的类型.
在下面的实验中,我在没有FrontEnd的交互式会话中使用了Mathematica 5.2 的内核.使用Mathematica 6和7 的内核,将获得不同的结果.其中一个原因是默认情况下这些版本Set会过载.
首先我评价$HistoryLength=0;具有DownValues用于In和Out变量不影响我的结果.但似乎即使$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个字节.
当然,这个实验并不能证明我的假设.
Information调用,并且(或)Definition上的跟踪没有显示任何内容。我必须假设这是一个访问表外部数据的低级函数。也许它保留了当时解析的原始定义表达式的副本。DefinitionFullDefinition*Values
| 归档时间: |
|
| 查看次数: |
470 次 |
| 最近记录: |