在mathematica中(我使用的是mma 5.0(猜测很旧)),如果我输入以下内容作为一行:
Needs["Graphics`Master`"]; Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 6, 1}]
然后我收到了很多错误/警告。但如果我单独输入它们,它工作正常。如何使它在一个代码块中工作?
谢谢!
答案 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[]
。