偶尔我会遇到以下情况 - 一个程序使用全局函数f[x]
进行一些计算,同时另一个程序f=5
将所有后续调用f[x]
转换为{{ 1}}
我知道本地化变量,但我更喜欢在开发早期使用全局变量。
我想不出混合OwnValues和DownValues的正当理由。有没有办法在上述情况发生时实施警告信息?
除了以下提示之外,还可以在Cell Options / Evaluation Options / CellContext
下的OptionsInspector中找到默认上下文。答案 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
可以是任何字母。缺点是需要四次击键才能输入符号而不是一次。