正如贝利撒留指出的那样,你的问题有点以 v5 为中心。然而,该问题在当前版本中仍然存在。举个例子
Needs["Combinatorica`"]
ToCycles[{3, 4, 1, 2}]
工作正常,同时(重新启动内核后),
Needs["Combinatorica`"]; ToCycles[{3, 4, 1, 2}]
失败并出现错误
“ToCycles::shdw:符号 ToCycles
出现在多个上下文中
{组合`,全球`};定义
在上下文 Combinatorica` 可能会产生阴影
或者被其他定义所掩盖。”
用 Mathematica 的术语来说,单行行不起作用的原因是 Mathematica 在计算之前尝试解析行中的所有符号Needs
(这对我来说是一个惊喜)。这解决了ToCycles
to Global`ToCycles
(从而在符号表中输入这个符号),之前Needs
有机会加载定义Combinatorica`ToCycles
并添加Combinatorica
to the $ContextPath。为了使一行行有效,您必须使用以下的全名:ToCyles
:
Needs["Combinatorica`"]; Combinatorica`ToCycles[{3, 4, 1, 2}]
要了解错误,你需要知道 Mathematica 中的所有符号都有一个全名形式的context`name
。上下文类似于许多其他语言中的名称空间。现在,如果一个符号(例如ToCycles
) 在没有上下文的情况下被引用,Mathematica 将查看当前的上下文$ContextPath
并查看该符号是否在任何这些上下文中定义。如果不是,则在当前上下文中解析该符号,$Context
这是Global
在正常使用情况下。
当您加载包时,该包的符号在包上下文中定义(例如Combinatorica
),当包完全加载时,此上下文将添加到$ContextPath
这样您就可以通过符号的短名称来访问它们。
现在,您可以看到该错误的含义:Combinatorica
解析符号时尚未加载,ToCycles
决心Global`ToCycles
。包加载后,Mathematica 会帮助检查所有短名称是否唯一,并在这种情况下发现短名称ToCycles
现在在两个上下文中定义$ContextPath
一个因此“遮蔽”另一个。要引用这些符号中的特定符号,您必须使用全名,例如Combinatorica`ToCycles
.
要解决影子冲突,只需Remove
不需要的符号:
Remove[Global`ToCycles]
不知道这篇文章的可读性如何,但希望它能有所帮助......