2.6.8 上下文总是给变量或定义选用尽可能清楚的名称是一个好思想,但这样做有时会导致 变量名很长. 在 Mathematica 中可以用上下文来组织符号名. 在引入与其它符号 不冲突的变量名的 Mathematica 程序包中上下文特别有用. 在编写或调用程序包时, 就需要了解上下文. 其基本的思想是任何符号的全名为两部分:上下文和一个短名. 全名被写为 context`short,其中`是倒引号,在Mathematica 中称为 上下文标记. 这里是具有短名 x 和上下文 aaaa 的符号
Out[1]= |  |
可以像其它符号一样使用这一符号
Out[2]= |  |
例如,可定义这个符号的值
Out[3]= |  |
Mathematica 将 a`x 和 b`x 当作两个完全不同的符号
Out[4]= |  |
典型的情况是让与一个特殊的主题相关的符号有相同的上下文. 例如,表示物理单位的符号具有上下文 PhysicalUnits`,这类符号 的全名可能是 PhysicalUnits`Joule, PhysicalUnits`Mole. 尽管总可以用全名来代表一个符号,但用短名常常很方便. 在 Mathematica 进程中的任何点,总有一个当前的上下文 $Context, 可以用短名简单地指代这个上下文中的符号. Mathematica 进程的默认上下文是 Global`
Out[5]= |  |
在当前上下文中,短名就够用了
Out[6]= |  |
上下文在 Mathematica 中的工作在某种程度上类似于许多操作系统的文件目录, 可以通过路径和全名指定一个文件. 但在任何点,总有一个当前目录,这类似于 Mathematica 的当前上下文. 在当前目录下的文件就可以仅用它的短名指定. 与许多操作系统中的目录一样,Mathematica 中的上下文具有启发式的特性, 例如,符号的全名可以涉及到一系列形如 ` ` `name 的上下文名. 在不同上下文中指定符号 在上下文 a`b` 中的符号
Out[7]= |  |
开始了一个 Mathematica 进程后,默认当前上下文是 Global`. 引入的符号通常就在这个上下文中. 但内部符号 Pi 等在 System` `Context 中. 为了方便地处理 Global` 和 System` 中的符号,Mathematica 支持 上下文搜索路径. 在 Mathematica 进程中的任一点,有当前 上下文 $Context 和当前上下文搜索路径 $ContextPath. 搜索路径的思想是在输入一个符号的短名后,Mathematica 在一系列 上下文中搜索去找到有这个短名的符号. Mathematica 中的 context 搜索路径与 Unix 和 MS-DOS 操作系统中搜索路径相似. 默认的上下文路径包括系统定义符号的 context
Out[8]= |  |
输入 Pi 时 Mathematica 将它翻译为具有全名 System`Pi 的符号
Out[9]= |  |
找出上下文和上下文搜索路径 在 Mathematica 中使用上下文时,在两个不同的上下文中两个符号可以 有相同的短名. 例如,在 PhysicalUnits` 和BiologicalOrganisms` context 中都可以使用短名 Mole. 于是, 在输入短名 Mole 后,就产生了你实际上调用了哪一个符号的问题. 解决这个问题时要弄清楚在上下文搜索路径中哪一个上下文先出现. 这里引入两个具有 Mole 短名的符号
Out[10]= |  |
这里对 $ContextPath 添加了两个上下文
Out[11]= |  |
在这里输入 Mole 时,得到了在 PhysicalUnits` 中的符号
Out[12]= |  |
一般地,当输入一个符号的短名后,Mathematica 认为你需要在 上下文搜索路径中最早出现的上下文中的符号. 上下文出现晚的符号将被屏蔽, 为了调用这些符号必须用全名. 在引入的新符号屏蔽了当前 $ContextPath 中已经存在的符号时, Mathematica 就会发出警告. 如果在笔记本环境中,Mathematica 就提示你要保存哪一个符号. 这里在 Global`Context 中引入了有短名 Mole 的符号,Mathematica 警告新符号屏蔽了已经存在的短名为 Mole 的符号
Out[13]= |  |
如果在这里输入 Mole,就会得到在 Global`Context 中的符号
Out[14]= |  |
如果引入的符号屏蔽了已经存在的符号,则需要重新安排 $ContextPath,或直接删去这个符号. 仅清除这个符号的值是不够的,必须从 Mathematica 中全部删除这个符号,这可以用函数 Remove[s] 来实现. 清除或删除Mathematica中的符号 删除符号 Global`Mole 此时输入 Mole 后就会得到符号 PhysicalUnits`Mole
Out[16]= |  |
当 Mathematica 显示一个符号名时,它必须选择去显示全名或短名. 它所作的是给出所有你应该输入的名称以得到特定的符号,给出当前 $Context 和 $ContextPath 的设置. 对第一个符号先显示短名,这就是输入短名后应该得到的符号
Out[17]= |  |
当输入了一个短名,它既不在当前上下文内,也不在上下文的搜索路径内, Mathematica 就产生一个具有该短名的新符号,且总是把新符号放在由 $Context 指定的当 前上下文中. 这里引入具有短名 tree 的符号
Out[18]= |  |
Mathematica 在当前上下文 Global` 内增加了tree
Out[19]= |  |
|