Wolfram mathematica 为什么我要对此进行两次评估?

Wolfram mathematica 为什么我要对此进行两次评估?,wolfram-mathematica,Wolfram Mathematica,我不明白为什么我要对这个问题进行两次评估(在Mathematica 7中) 第一次评价: Unprotect[Rule]; Attributes[Rule] pp = Plot | LogLinearPlot | ListPlot | ParametricPlot3D; (h : pp)[True -> False] ^:= Print["Irrelevant data"] (* Out[2]= {SequenceHold} During evaluation of In[1]:=

我不明白为什么我要对这个问题进行两次评估(在Mathematica 7中)

第一次评价:

Unprotect[Rule];
Attributes[Rule]
pp = Plot | LogLinearPlot | ListPlot | ParametricPlot3D;
(h : pp)[True -> False] ^:= Print["Irrelevant data"]

(*

Out[2]= {SequenceHold}

During evaluation of In[1]:= UpSetDelayed::write: Tag Rule in (h:Plot|LogLinearPlot|ListPlot|ParametricPlot3D)[True->False] is Protected. >>

Out[4]= $Failed

*)
Out[2]={SequenceHold}
中可以看出,
取消保护[Rule]
工作正常,但错误消息表明情况并非如此。如果我第二次计算单元格,则赋值将进行,并且不会生成错误


为什么会发生这种情况?

正如您所知,Mathematica加载二进制MX文件来实现其某些功能。这些MX文件存储实现以及定义和属性

这是隐蔽的,但是您的
取消保护[Rule]
被Mathematica新加载的MX文件撤消,这解释了为什么它第二次起作用。因为Mathematica已经加载了它需要的所有MX文件

如果首先计算表达式中的所有符号,则表达式将停止抱怨:

{Unprotect, Rule, Attributes, Plot, LogLinearPlot, ListPlot, 
  ParametricPlot3D, True, False, Print};
Unprotect[Rule];
Attributes[Rule];
pp = Plot | LogLinearPlot | ListPlot | ParametricPlot3D;
(h : pp)[True -> False] ^:= Print["Irrelevant data"]

编辑在取消保护
规则

之前,需要进行第一次评估以触发所有自动加载。让我看看我是否理解这一点。Mathematica仅当其中一个绘图函数出现时(通过
DeclarePackage
或类似方式)才加载该函数,并且该程序包包含
取消保护[规则]。。。保护[规则]
pair(或类似的东西)。正确吗?不完全正确,它包含符号的属性。有点像
SetAttributes[a,Protected];DumpSave[FileNameJoin[{$HomeDirectory,“Desktop”,“tmp.mx”}],a]然后
取消保护[a];获取[FileNameJoin[{$homeditory,“Desktop”,“tmp.mx”}];a=1
。在这种情况下,罪魁祸首是
LogPlot.mx
,它是在计算符号
LogLinearPlot
时加载的。为什么要恢复
规则的受保护状态对我来说是个谜。也许有一个
取消保护[规则];。。。;保护该文件中的[规则]
序列。有趣的是,
LogLinearPlot
没有由
DeclarePackage
生成的通常的
Stub
属性。这里肯定有其他自动加载机制在工作。@Sasha感谢分享这些信息。从用户的角度来看,我仍然将其归类为bug——这与关于符号保护的非常通用的语言语义以及文档相矛盾。一旦生产中使用的第三方mma代码数量变得巨大(假设这种情况曾经发生过),这种情况就会成为一个真正的问题。至少,IMO需要官方的编码指南和一个用户永远不应该修改的内置函数列表,也就是说,这样的修改将导致未定义的行为。@FREACH.mx文件加载无法通过
存根
工作。添加了一个定义,以便计算符号将加载.mx文件(然后清除特殊定义)