在Mathematica中(我使用的是相当古老的MMA 5.0),如果我将以下内容作为一行输入:
Needs["Graphics`Master`"]; Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 6, 1}]
我遇到了很多错误/警告。但是如果我单独输入它们,就能正常工作。如何使它在一个代码块中工作呢?
谢谢!
在Mathematica中(我使用的是相当古老的MMA 5.0),如果我将以下内容作为一行输入:
Needs["Graphics`Master`"]; Animate[Plot[Sin[n x], {x, 0, 2 Pi}, Axes -> False], {n, 1, 6, 1}]
正如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
的全名。一个上下文类似于许多其他语言中的命名空间。现在,如果一个符号(比如 ToCycles
)没有指定上下文,Mathematica 将查找当前在 $ContextPath
中的上下文,并查看该符号是否在任何其中定义。如果没有,则该符号将在当前上下文 $Context
中解析,而在正常使用中它是Global
。Combinatorica
),并且当包被完全加载后,该上下文会被添加到$ContextPath
中,以便您可以通过其简短名称访问符号。Combinatorica
包,因此 ToCycles
被解析为 Global`ToCycles
。在包被加载后,Mathematica 会检查所有简短名称是否唯一,并发现在这种情况下简短名称 ToCycles
现在定义在 $ContextPath
的两个上下文中,一个"遮蔽"了另一个。要引用这些符号的特定之一,必须使用全名,例如Combinatorica`ToCycles
。Remove
去除不需要的符号即可。Remove[Global`ToCycles]
不知道这个是否易读,但希望能对你有所帮助...
你需要把Needs[]
函数放在笔记本的顶部作为单独的模块,或者放在package.m文件的第一行。
内核会读取整行并解析它,包括为符号决定上下文,然后才开始评估它。为避免问题,请不要使用分号。 在包中的每个语句后面都要放置两个换行符,尤其是在BeginPackage[]
和/或Needs[]
之后。
;
实际上是CompoundExpression
的简写,这就是为什么事情会有所不同的原因。不过,符号解析并没有真正包含在 http://reference.wolfram.com/mathematica/tutorial/Evaluation.html 中 :) - Janus