上下文

总是给变量或者定义选用尽可能清楚的名称是一个好思想. 但这样做有时会导致变量名很长.

Mathematica 中,可以用上下文来组织符合名. 在引入与其它符号不冲突的变量名的 Mathematica 程序包中上下文特别有用. 在编写或者调用 Mathematica 程序包时,就需要了解上下文.

其基本的思想是任何符号的全名为两部分:上下文和短名. 全名被写为 ,其中 是倒引号或重音符字符( ASCII 二进制代码 96),在 Mathematica 中称为上下文标记.

这里是具有短名 和上下文 的符号.
In[1]:=
Click for copyable input
Out[1]=
可以像其它符号一样使用这一符号.
In[2]:=
Click for copyable input
Out[2]=
例如,可以定义这个符号的值.
In[3]:=
Click for copyable input
Out[3]=
Mathematica 当作两个完全不同的符号.
In[4]:=
Click for copyable input
Out[4]=

典型的情况是让与一个特殊的主题相关的符号有相同的上下文. 例如,表示物理单位的符号具有上下文. 这类符号的全名可能是 或者 .

尽管总可以用全名来代表一个符号,但是用短名常常很方便.

Mathematica 进程中的任何点,总有一个当前的上下文 $Context. 可以用短名简单地指代这个上下文中的符号,除非该符号被 $ContextPath 中具有相同短名的符号屏蔽. 如果具有给定短名的符号在上下文路径中存在,它将被使用,而不是当前上下文中的符号被使用.

Mathematica 进程的默认上下文是 .
In[5]:=
Click for copyable input
Out[5]=
$ContextPath 中不存在名为 的符号,因此在当前上下文中用短名指代符号是足够的.
In[6]:=
Click for copyable input
Out[6]=

上下文在 Mathematica 中的作用在某种程度上类似于许多操作系统的文件目录,可以通过路径和全名指定一个文件. 但在任何点,总有一个当前目录,这类似于 Mathematica 的当前上下文. 在当前目录下的文件就可以仅用它的短名指定.

与许多操作系统中的目录一样,Mathematica 中的上下文具有启发式(分层)的特性. 例如,符号的全名可以涉及到一系列形如 的上下文名.

context `name orc1`c2 ... `name在明确指定的上下文中的符号
`name当前上下文中的符号
`context`name or`c1`c2` ... `name与当前上下文相关的在一个指定上下文中的符号
name在当前上下文或者在上下文搜索路径中的符号

在不同上下文中指定符号.

在上下文 中的符号.
In[7]:=
Click for copyable input
Out[7]=

开始了一个 Mathematica 进程后,默认当前上下文是 . 引入的符号通常就在这个上下文中. 但是,内部符号Pi 等在上下文 中.

为了方便地处理 中的符号,Mathematica 支持上下文搜索路径. 在 Mathematica 进程中的任一点,有当前上下文 $Context 和当前上下文搜索路径 $ContextPath. 搜索路径的意思是在输入一个符号的短名后,Mathematica 在一系列上下文中搜索去找到有这个短名的符号.

Mathematica 中的上下文搜索路径与操作系统提供的程序文件的"搜索路径"相似. 由于 $Context 是在$ContextPath 之后搜索的,我们可以认为它在文件搜索路径后添加".".

默认的上下文路径包括系统定义符号的上下文.
In[8]:=
Click for copyable input
Out[8]=
当输入 Pi 时,Mathematica 将它翻译为具有全名 的符号.
In[9]:=
Click for copyable input
Out[9]=
Context[s]一个符号的上下文
$ContextMathematica 进程中的当前上下文
$ContextPath当前上下文搜索路径
Contexts[]所有上下文组成的集合

找出上下文和上下文搜索路径.

Mathematica 中使用上下文时,在两个不同的上下文中两个符号可以有相同的短名. 例如,在上下文 中都可以使用短名 的符号.

于是,在输入短名 后,就产生了用户实际上调用了哪一个符号的问题. 解决这个问题时要弄清楚在上下文搜索路径中哪一个上下文先出现.

这里引入两个具有 短名的符号.
In[10]:=
Click for copyable input
Out[10]=
这里对 $ContextPath 添加了两个上下文. 通常,Mathematica$ContextPath 开头添加新的上下文.
In[11]:=
Click for copyable input
Out[11]=
现在如果输入 ,得到了在上下文 中的符号.
In[12]:=
Click for copyable input
Out[12]=

一般地,当输入一个符号的短名后,Mathematica 认为用户需要在上下文搜索路径中最早出现的上下文中的符号. 结果,上下文出现晚的符号或者在当前上下文中具有相同短名的符号将被屏蔽,为了调用这些符号必须使用全名.

在引入的新符号屏蔽了当前 $ContextPath 中已经存在的符号时,Mathematica 就会发出警告. 另外,如果在笔记本前端,Mathematica 就提示用户对屏蔽的符号使用红色.

这里在 上下文中引入了有短名 的符号,Mathematica 警告新符号屏蔽了已经存在的短名为 的符号.
In[13]:=
Click for copyable input
Out[13]=
如果在这里输入 ,就会得到上下文路径 的符号.
In[14]:=
Click for copyable input
Out[14]=

如果引入的符号屏蔽了已经存在的符号,则需要重新安排 $ContextPath,或者直接删去这个符号. 用户应该意识到,仅清除这个符号的值是不够的,必须从 Mathematica 中全部删除这个符号. 这可以用函数 Remove[s] 来实现.

Clear[s]清除一个符号的值
Remove[s]从系统中完全删除一个符号

清除或删除 Mathematica 中的符号.

删除符号 .
In[15]:=
Click for copyable input
此时输入 后,就会得到符号 .
In[16]:=
Click for copyable input
Out[16]=

Mathematica 显示一个符号名时,它必须选择区显示全名或者短名. 它所做的是给出所有用户应该输入的名称以得到特定的符号,给出当前 $Context$ContextPath 的设置.

对第一个符号先显示短名,这就是输入短名后应该得到的符号.
In[17]:=
Click for copyable input
Out[17]=

当输入了一个短名,它既不在当前上下文内,也不在上下文的搜索路径内,Mathematica 就产生一个具有该短名的新符号,且总是把新符号放在由 $Context 指定的当前上下文中.

这里引入具有短名 的符号.
In[18]:=
Click for copyable input
Out[18]=
Mathematica 在当前上下文 内增加了 .
In[19]:=
Click for copyable input
Out[19]=
New to Mathematica? Find your learning path »
Have a question? Ask support »