mathematica中的包导入问题

时间:2011-01-12 00:04:52

标签: wolfram-mathematica

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

Needs["Graphics`Master`"]; Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 6, 1}]

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

谢谢!

2 个答案:

答案 0 :(得分:12)

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

Needs["Combinatorica`"]
ToCycles[{3, 4, 1, 2}]

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

Needs["Combinatorica`"]; ToCycles[{3, 4, 1, 2}]

错误而失败
  

“ToCycles :: shdw:符号ToCycles   出现在多个上下文中   {Combinatorica`,Global`};定义   在上下文Combinatorica`可能阴影   或被其他定义遮蔽。“

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

Needs["Combinatorica`"]; Combinatorica`ToCycles[{3, 4, 1, 2}]

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

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

Remove[Global`ToCycles]

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

答案 1 :(得分:2)

您应该将Needs[]调用放在笔记本顶部的单独块中,或放在package.m文件的第一个隔离行上。

内核读取整行并解析它,包括在开始评估它之前决定符号的上下文。为避免出现问题,请勿使用分号。在包中的每个语句之后放置两个换行符。 特别是在BeginPackage[]和/或Needs[]

之后