【问题标题】:Why do I have to evaluate this twice?为什么我要评估两次?
【发布时间】:2011-04-13 12:42:06
【问题描述】:

我不明白为什么我必须评估两次(在 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} 可以看出,Unprotect[Rule] 有效,但错误消息表明并非如此。如果我第二次评估该单元格,则赋值不会产生错误。

为什么会这样?

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    您可能很清楚,Mathematica 加载二进制 MX 文件以实现其某些功能。这些 MX 文件存储实现以及定义和属性。

    这是阴险的,但是您的 Unprotect[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"]
    

    EDIT在取消保护Rule之前,需要进行第一次评估以触发所有自动加载。

    【讨论】:

    • 让我看看我是否明白这一点。 Mathematica 仅在其中一个 Plot 函数出现时加载(通过DeclarePackage 或类似的东西)并且该包包含Unprotect[Rule] ... Protect[Rule] 对(或类似的东西)。对吗?
    • 不完全,它包含符号的属性。有点像SetAttributes[a, Protected]; DumpSave[FileNameJoin[{$HomeDirectory, "Desktop", "tmp.mx"}], a];,然后是Unprotect[a]; Get[FileNameJoin[{$HomeDirectory, "Desktop", "tmp.mx"}]]; a = 1。
    • 在这种情况下,罪魁祸首是LogPlot.mx,它是在评估符号LogLinearPlot 时加载的。为什么要恢复Rule 的受保护状态对我来说是个谜。也许该文件中有一个Unprotect[Rule];...;Protect[Rule] 序列。有趣的是,LogLinearPlot 没有DeclarePackage 嵌入的通常的Stub 属性。这里肯定有其他一些自动加载机制在起作用。
    • @Sasha 感谢您分享此信息。从用户的角度来看,我仍然会将其归类为错误 - 这与关于符号保护的非常一般的语言语义以及文档相矛盾。一旦生产中使用的第三方 mma 代码的数量变得很大(假设这种情况曾经发生过),这样的情况就会成为一个真正的问题。至少,IMO 官方编码指南需要用户永远修改的内置函数列表,即此类修改将导致未定义的行为。
    • @WReach .mx 文件加载无法通过 Stub 进行。添加了一个定义,以便评估符号将加载 .mx 文件(然后清除特殊定义。)
    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2018-02-24
    • 2017-06-20
    • 2017-01-19
    • 1970-01-01
    • 2022-07-12
    相关资源
    最近更新 更多