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
保护,因此很容易安排任何其他符号。