检测DownValue / OwnValue冲突

时间:2010-11-24 01:34:15

标签: wolfram-mathematica

偶尔我会遇到以下情况 - 一个程序使用全局函数f[x]进行一些计算,同时另一个程序f=5将所有后续调用f[x]转换为{{ 1}}

我知道本地化变量,但我更喜欢在开发早期使用全局变量。

我想不出混合OwnValues和DownValues的正当理由。有没有办法在上述情况发生时实施警告信息?

除了以下提示之外,还可以在Cell Options / Evaluation Options / CellContext

下的OptionsInspector中找到默认上下文。

2 个答案:

答案 0 :(得分:11)

您可以使用Protect[f]来避免进一步分配(任何类型)和Unprotect[f]再次允许分配。

您还可以使用up-value做一些简单的hackery,以防止Set[f, ...]f上实际放置自己的值,但仍然允许在不使用{{1}的情况下分配down-values } / Protect

Unprotect

上述内容透明地阻止了In[76]:= ClearAll[f] In[77]:= f /: Set[f, x_] := x In[78]:= f = 7 Out[78]= 7 In[79]:= f Out[79]= f In[80]:= f[x_] := x + 1 In[81]:= f[1] Out[81]= 2 Set的使用。发布实际消息也很简单:

f

答案 1 :(得分:3)

这不回答有关生成警告消息的原始问题,但Formal Symbols可用作全局符号。它们会自动受到保护,因此不会被意外重新定义。您可以使用按键<ESC>$f</ESC>输入正式符号,其中f可以是任何字母。缺点是需要四次击键才能输入符号而不是一次。