mathematica中的包导入问题

Qia*_* Li 5 wolfram-mathematica

在mathematica(我使用的是mma 5.0(猜测很旧)),如果我将以下内容键入一行:

Needs["Graphics`Master`"]; Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 6, 1}]
Run Code Online (Sandbox Code Playgroud)

然后我收到了很多错误/警告.但如果我单独输入它们,它工作正常.如何使它在一个代码块中工作?

谢谢!

Jan*_*nus 12

正如belisarius指出的那样,你现在的问题是有点以v5为中心.然而,问题仍然存在于当前版本中.举个例子

Needs["Combinatorica`"]
ToCycles[{3, 4, 1, 2}]
Run Code Online (Sandbox Code Playgroud)

工作正常,而(重启内核后),

Needs["Combinatorica`"]; ToCycles[{3, 4, 1, 2}]
Run Code Online (Sandbox Code Playgroud)

失败并出现错误

"ToCycles :: shdw:符号ToCycles出现在多个上下文{Combinatorica`,Global`}中;上下文Combinatorica中的定义可能会被其他定义遮蔽或遮蔽."

在Mathematica术语中,单行不起作用的原因是Mathematica在评估之前尝试解析行中的所有符号Needs(这对我来说是一个惊喜).这解析ToCyclesGlobal`ToCycles(因此在符号表中输入此符号),之后Needs有机会加载定义Combinatorica`ToCycles并添加Combinatorica$ContextPath.要使单线程工作,您必须使用以下全称ToCyles:

Needs["Combinatorica`"]; Combinatorica`ToCycles[{3, 4, 1, 2}]
Run Code Online (Sandbox Code Playgroud)

要理解错误,您需要知道Mathematica中的所有符号都具有表单的全名context`name.上下文类似于许多其他语言中的命名空间.现在,如果在ToCycles没有上下文的情况下引用符号(例如),Mathematica将查看当前的上下文,$ContextPath并查看该符号是否在任何上下文中定义.如果不是,$ContextGlobal在正常使用的当前上下文中解析符号.
加载包时,该包的符号在包上下文中定义(例如Combinatorica),当包完全加载时,将该上下文添加到该包中,$ContextPath以便您可以通过其短名称访问这些符号.
现在,您可以看到错误的含义:由于在解析Combinatorica符号时尚未加载,因此ToCycles解析为Global`ToCycles.在加载包之后,Mathematica帮助检查所有短名称是否唯一,并且在这种情况下发现短名称ToCycles现在在$ContextPath一个上下文中定义,从而"遮蔽"另一个.要引用这些符号的特定内容,您必须使用全名,例如Combinatorica`ToCycles.

要解决阴影冲突,只Remove需要不需要的符号:

Remove[Global`ToCycles]
Run Code Online (Sandbox Code Playgroud)

不知道这有多可读,但希望它有点帮助......