2.13.1 主循环在任何进程中,Mathematica 循环运行. 它等待输入, 处理输入, 显示结果, 然后再返回来等待新的输入. 作为这个主循环的一部分,Mathematica 保持 和使用各种全局对象,用这些对象工作常常是很有用的. 但是要清楚,通过某一特定前端使用 Mathematica 时,该前端会建立 自己的主循环,本节所叙述的内容不一定适用. 输入输出表达式 在标准的交互进程中有一个输入和输出行序列. Mathematica 将这些行的表达式值存放在 In[n] 和 Out[n] 中. 像通常由 "In[n]:=提示" 所表明的一样,输入表达式用 延时赋值存放. 这意味着每次需要 In[n] 时,这一输入表达式将 在当前环境中重新计算. 这里对 x 赋一个值
Out[1]= |  |
现在使用 x 的值
Out[2]= |  |
这里删除 x 的值 在当前环境中重新计算,对 x 没有赋任何值
Out[4]= |  |
这里给出第二个输入行的文本形式,它适合于编辑和其它文本操作 Out[5]//InputForm=
 |
指定要保持的进程历史长度 Mathematica 默认保存进程过程中所有输入和输出行. 在很长的进程中, 这会占用大量的计算机内存. 但通过使用 Unprotect[In, Out], 后跟 Clear[In, Out] 明显清除 In 和 Out 的值可以删除输入和输出行. 通过设置全局 变量 $HistoryLength 也可以令 Mathematica 保存前面的有限行. 注意在一个进程的任何点,可以重新设置行计数器 $Line,这样就可以用新 行去覆盖前面的行. 在主循环中使用的全局函数 Mathematica 提供了各种 "挂钩" 以便插入用于主循环各个阶段表达式的函数. 例如,赋以全局变量 $Pre 的值的函数在任何输入的表达式计算之前自动使用. 对一个特定输入行而言,标准的主循环从得到一个输入文本字符串开始. 特别是需要处理特殊字符串时,有可能在Mathematica 进一步加工之前需要修改这个 文本字符串. 这可以通过将一个函数赋以全局变量 $PreRead 的值来实现. 该函数将作用于这个字符串,其结果将作为这个特殊输入行 实际的输入字符串. 这里令 Mathematica 在每个输入字符串中用 ... 代替 << ... >>
Out[6]= |  |
现在就可以将花括号当作尖角括号输入
Out[7]= |  |
当不修改输入字符串的值时,可以用这一种方式删除 $PreRead 的定义 输入字符串由 $PreRead 处理完后就由 Mathematica 读入.这时 Mathematica 可能会发现字符串中有语法错误. 当错误出现时就调用指定为 $SyntaxHandler 值的函数. 它使用两个变量:这个输入字符串和出现语法错误的字符串 位置.用$SyntaxHandler 可以分析语法错误或调用一个编辑器. 当所用函数 返回一个字符串时,Mathematica 就将这个字符串作为新的输入字符串. 这里指出发生语法错误时 Mathematica 应该做什么
Out[9]= |  |
这个输入产生了一个语法错误
Mathematica 读入一个表达式成功后就计算它.在计算之前,Mathematica 使用指定为 $Pre 值的函数,计算之后它使用指定为$Post 值的函数. 注意,除非 $Pre 函数保持它的变量不计算,该函数与 $Post 有相同的效果. $Post 用来给出从 Mathematica 所得结果的后处理. 例如,为了使用 Mathematica 得到所产生结果的近似值,需要设置$Post=N. 这里令 Mathematica 对每个结果使用函数 N
Out[10]= |  |
现在 Mathematica 对任何输入进行近似
Out[11]= |  |
这里删除所给定的后处理函数 Mathematica 产生结果后使用某个指定的 $Post 函数,然后取出结果赋于 Out[$Line]. 下一步 Mathematica 显示该结果,但在这之前要使用某个指定为 $PrePrint 值的函数. 这里令 Mathematica 将所有输出缩短为 2 行 仅显示了 2 行形式的输出
Out[14]= |  |
这里删除赋于 $PrePrint 的值 在一般的 Mathematica 进程中产生各种类型的输出. 每一种类型的输出送往确 定的输出通道. 每一个输出通道有一个全局变量,它给出要包含在这个输出通道 中的输出流列表. 在标准 Mathematica 对话中的输出通道 通过修改在给定输出通道中的流列表,可以重新定向或复制特定类型的 Mathematica 输出. 例如,通过打开一个到文件的输入流, 且将它包含在 $Echo 列表中, 就可以将每个对 Mathematica 的输入存在一个文件中. 在 Mathematica 进程中打开流 函数 Streams 显示所有输入, 输出和在一个 Mathematica 进程中的某一点打开的 其它流. 变量 $Input 给出特定点Mathematica 输入流的名称. 在 Get 合作的执行 过程中,重新设置 $Input. 信息参数 有各种确定 Mathematica 所产生信息形式的全局参数. 像 2.8.21 节讨论的一样,典型的信息包含一个表达式序列,它们与 StringForm 的信息文本相结合. $MessagePrePrint给出了在显示之前作用于表达式的函数. $MessagePrePrint 的默认值是 Short. 像 2.8.22 节讨论的一样,在 Mathematica 中可以指定信息所使用的语言. 在一个 Mathematica 进程中,可以把一个语言名列表指定为 $Language 的值. 结束 Mathematica 进程 在明确告诉退出之前 Mathematica 将一直进行主循环. 大部分 Mathematica 界面 提供了退出的特殊方法. 但总可以调用 Exit 或 Quit 退出. Mathematica 允许对全局变量 $Epilog 给出一个值去指定 Mathematica 实际退出之前进行的运算. 用这种方法可以让Mathematica 在退出之前保存某些对象. 决定处理文件结束字符的全局变量 像在 2.7.5 节中讨论的一样,Mathematica 通常并不按特殊方式处理特殊字符. 但可能有一个例外. 用默认设置$IgnoreEOF=False, Mathematica 能识别文 件结束字符. 当在标准交互 Mathematica 进程的一个输入行仅接收到一个 文件结束字符时,Mathematica 就退出这个进程. 怎样输入文件结束字符依赖于所使用的计算机系统. 例如,在 Unix 中, 一般用 Control-D. 注意,如果在批处理模式下使用 Mathematica,其中所有的输入来源于 一个文件,不管 $IgnoreEOF 的值如何, 到文件结束就自动退出.
|