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

Wolfram mathematica 关于符号的定义和价值的问题,wolfram-mathematica,Wolfram Mathematica,Definition“知道”符号值的定义方式:使用Set或SetDelayed。但是怎么做呢?据我所知,分配符号值后,计算器的分配方式没有任何区别:使用Set或SetDelayed。它可以通过函数OwnValues来说明,该函数总是返回带有标题的定义。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

Definition
“知道”符号值的定义方式:使用
Set
SetDelayed
。但是怎么做呢?据我所知,分配符号值后,计算器的分配方式没有任何区别:使用
Set
SetDelayed
。它可以通过函数
OwnValues
来说明,该函数总是返回带有
标题的定义。
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}

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

OwnValues[a]={HoldPattern[a]->3};OwnValues[a]
给出了
{HoldPattern[a]:>3}
而不是
{HoldPattern[a]->3}
,但是
定义[a]
显示了人们可以期望的结果。该定义可能以
Rule
的形式存储在内部,但通过
OwnValues
转换为
RuleDelayed
,以抑制对定义的r.h.s的评估。这个假设与我最初的理解相矛盾,即
Set
SetDelayed
指定的值之间没有差异。这些定义可能以不同的形式存储:
Rule
RuleDelayed
,但从评估者的角度来看,它们是等效的

有趣的是,看看
MemoryInUse[]
如何依赖于定义的类型

在下面的实验中,我在没有前端的交互式会话中使用了Mathematica 5.2的内核。使用Mathematica 6和7的内核,将得到不同的结果。原因之一是

首先,我计算
$HistoryLength=0用于具有不影响我的结果的
In
Out
变量的
down值。但是,即使将
$HistoryLength
设置为0,[$Line]
中当前输入行的
值在输入新输入后仍然被存储和删除。这可能就是为什么
MemoryInUse[]
的第一次评估结果总是与第二次不同的原因

以下是我得到的:

Mathematica 5.2学生版:Microsoft Windows版本

版权所有1988-2005 Wolfram研究公司

--终端图形已初始化--

[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

可以看出,定义
a=2
内存使用[]
增加1986824-1986760=64字节。将其替换为定义
a:=2
内存使用[]
增加1986952-1986824=128字节。用前一个定义替换后一个定义将
MemoryInUse[]
还原为1986824字节。这意味着延迟定义需要比立即定义多128字节


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

符号的完整定义可以通过未记录的八合一符号
语言`扩展定义
语言`扩展完整定义
来访问。引用:


“如果有人好奇,
Language`ExtendedDefinition
Language`ExtendedFullDefinition
类似于
Definition
FullDefinition
,但捕获符号的定义的方式可以在另一个内核中复制。例如,
defs=Language`ExtendedFullDefinition[sym]
返回
Language`DefinitionList
对象。用于还原定义的语法非常不规则:
Language`ExtendedFullDefinition[]=defs
,其中
defs
Language`DefinitionList
。请注意
Language`ExtendedFullDefinition
采用
ExcludedContexts
选项,而
Language`ExtendedDefinition
不采用该选项。”

另一个好问题Alexey.有一个非常重要的用例,它对作业中使用的内容产生了真正的影响-
Set
SetDelayed
:作业的
部分。对抗
tst={1,2,3};tst[[2]=5;tst
(工作正常)与
tst1:={1,2,3};tst1[[2]=5
(给出赋值错误,
tst1的“无立即值”)当然,
tst
tst1
OwnValues
看起来是一样的,正如您所观察到的。根据您对内存消耗的观察,我猜延迟定义可能会使用一些中间内部变量,而立即定义则直接指向存储数据的内存。而不是在解析时:
a=1+1;定义[a]
给出
a=2
。我假设在真的
OwnValues
中保留定义上的信息,但不显示:如果我们计算
OwnValues[a]={HoldPattern[a]>3};