首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于符号的定义和价值的问题

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

Stack Overflow用户
提问于 2011-05-07 13:17:38
回答 3查看 511关注 0票数 8

Definition“知道”如何定义符号值的方式:使用Set或SetDelayed。但是怎么做呢?据我所知,在为一个符号赋值之后,赋值器如何赋值没有任何区别:使用Set或SetDelayed。可以通过函数OwnValues来说明这一点,该函数总是返回带有Head RuleDelayed的定义。Definiton是如何获取这些信息的?

代码语言:javascript
复制
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}
EN

回答 3

Stack Overflow用户

发布于 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个字节。

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

票数 7
EN

Stack Overflow用户

发布于 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不采用。”

票数 4
EN

Stack Overflow用户

发布于 2011-05-07 14:14:58

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5919284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档