Wolfram mathematica 检测DownValue/OwnValue冲突

Wolfram mathematica 检测DownValue/OwnValue冲突,wolfram-mathematica,Wolfram Mathematica,有时我会遇到以下情况——一个过程使用全局函数f[x]进行一些计算,同时另一个过程执行f=5,这将所有后续调用f[x]转换为5[x] 我知道如何本地化变量,但我更喜欢在开发的早期使用全局变量 我想不出一个合理的理由来混合自己的价值观和贬低的价值观。当发生上述情况时,是否有方法实现警告消息 除了下面的提示之外,默认上下文可以在选项检查器的单元格选项/评估选项/CellContext下找到。您可以使用保护[f]避免进一步的分配(任何类型),也可以使用取消保护[f]再次允许分配 您还可以对up值进行一些

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

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

我想不出一个合理的理由来混合自己的价值观和贬低的价值观。当发生上述情况时,是否有方法实现警告消息


除了下面的提示之外,默认上下文可以在选项检查器的单元格选项/评估选项/CellContext下找到。您可以使用
保护[f]
避免进一步的分配(任何类型),也可以使用
取消保护[f]
再次允许分配

您还可以对up值进行一些简单的黑客攻击,以防止
设置[f,…]
将自己的值实际放在
f
上,但仍然允许分配down值,而不必使用
保护
/
取消保护

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
上述操作明显阻止了在
f
上使用
Set
。发出实际消息也很简单:

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

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

如果存在DownValue/OwnValue冲突,您如何看待覆盖Set/SetDelayed以打印警告消息?可能是这样,但可能很脆弱。您是否考虑过使用上下文(
Begin
/
End
)或设置单元格/笔记本级别的上下文?+1,我没有想过使用这样的上限值。聪明。此外,您还对单元/笔记本级别的上下文提出了很好的观点;我发现它们是自v。5.我不知道笔记本级别的上下文,是在帮助页面的某个地方吗?@Yaroslav Bulatov,在Mathematica 7中,遵循以下菜单树:评估->笔记本的默认上下文(靠近底部)->此笔记本或每个单元格组特有的。这是因为每个笔记本/电池组本质上都有自己的
Global
。因此,它们不会相互干扰。当您有多条执行某项操作的路径并且希望对它们进行测试时,单元组上下文非常好。+1表示有用的消息。是否可以通过编程方式(例如,在包中)使用双击字母或希腊字母生成正式符号?如果不是,我想正式符号文档中的makebox示例将允许替换(字符和/或颜色)。这可能是一个非常有用的设计技巧。:)@telefunkenvf14如果你指的是正式符号的独特视觉外观(上面和下面的点),我不知道有什么方法可以生成其他这样的符号。据我所知,虚线字母是特殊字体的字符。使用
Underoverscript
symbol
可能会很接近,但从键盘输入结果可能会很麻烦。正式符号的其他特征是,它们缺乏内置定义,并且由
Protect
保护,因此很容易安排任何其他符号。