Wolfram mathematica 为什么我要对此进行两次评估?
我不明白为什么我要对这个问题进行两次评估(在Mathematica 7中) 第一次评价: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]:=
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文件(然后清除特殊定义)