检测DownValue/OwnValue冲突

Yar*_*tov 7 wolfram-mathematica

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

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

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

除了以下提示之外,还可以在Cell Options/Evaluation Options/CellContext下的OptionsInspector中找到默认上下文

Mic*_*lat 11

您可以使用Protect[f]以避免进一步分配(任何类型)并Unprotect[f]再次允许它们.

你也可以用up-values做一些简单的hackery,以防止Set[f, ...]实际放置自己的值f但仍然允许分配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
Run Code Online (Sandbox Code Playgroud)

以上内容透明地阻止了Seton 的使用f.发出实际消息也很简单:

In[93]:= f::noov = "Blocked attempt to assign `1` as an OwnValue of f";

In[94]:= f /: Set[f, x_] := (Message[f::noov, x]; x)

In[95]:= f = 7

During evaluation of In[95]:= f::noov: Blocked attempt to assign 7 as
   an OwnValue of f

Out[95]= 7
Run Code Online (Sandbox Code Playgroud)

  • @Yaroslav Bulatov,在Mathematica 7中按照以下菜单树:评估 - >笔记本的默认上下文(靠近底部) - >此笔记本或每个单元组的独特之处.这适用于每个Notebook/Cell Group本质上都有自己的`Global`.所以,他们不会互相干扰.当你有多个做某事的路径并希望对它们进行全部测试时,Cell Group上下文很不错. (4认同)