GetHelpBrowserLocationMetaTag Rest LinkTrail Tags First Null
此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)
 /

2.6.3 模块工作方式

Mathematica 中模块的基本工作方式非常简单. 任何模块每一次使用时,就产生 一个新符号去代表它的每一个局部变量. 新符号的名字被唯一地给定,它不能 跟任何其它名字冲突. 命名的方法是在给定的局部变量后加 $, 并给出唯一的序号.

Mathematica中模块的基本原理

这里说明了模块内所产生 t 的符号

任何模块每一次运行时产生的符号不同

在绝大部分情况下,不需要直接涉及模块内产生的实际符号, 但在一个模块的执行过程中打开对话时就会看到这些符号. 同样, 用 Trace 等也能观察模块的计算.

Trace 观察模块内部产生的符号

在模块中打开对话

在对话内看到为 t 等局部变量产生的符号

可以象其它符号一样来处理这些符号

从对话返回

直接返回模块内产生的符号有时是方便的.

直接返回模块内所产生的符号

可以与其它符号一样处理这些符号

通过唯一的名称产生新符号

函数 UniqueModule 一样产生新符号,每次调用 Unique 时, $ModuleNumber 增加,故可保证新符号的名称不重复.

产生唯一的名称以 x 开头的 新符号

每调用一次 Unique 就得到一个序列号更大的符号

对一个集合调用 Unique,得到每个符号有相同的序列号

可以用 得到在模块中或用 Unique 函数产生符号的信息.

执行这一模块产生符号 q$nnn

这里可以看到所产生的符号

模块产生的符号与计算中的符号性能相同,但这些符号具有 Temporary 属性,当不再使用时它们会被系统删除,所以在模块内产生的 符号当模块执行完时就被删除. 那些明确返回的符号才能继续存在.

这里显示了在模块内产生的新变量 q

这个新变量在模块执行结束时被删除,所以这里不再出现

应该意识到对所产生的符号用 等符号名完全是一种约定. 一般地, 可以对任何符号用这类符号,但这样做时可能会与模式所产生的符号重合. 重要的一点是由模式所产生的符号的唯一性仅仅在 Mathematica 的一个进程中 是唯一的,决定符号序列数的变量 $ModuleNumber 在每个进程的开始时 总是重新设置,这意味着将含有所产生符号的表达式存在一个文件中, 然后在另一个进程中打开该文件时无法保证不冲突. 避免这种冲突的一个 途径是在每个进程的开始时直接设置不同的 $ModuleNumber, 特别,当设置 $ModuleNumber = 10^10 $SessionID 时就可以避免任何冲突. 全局变量 $SessionID 给出刻划特定 Mathematica 进程的唯一数.这个变量的 值由日期和时间, 所用计算的 ID, 以及特定 Mathematica 过程的 ID 等决定.

决定所产生符号序列号的函数

在产生了表示局部变量的符号后,Module[vars, body] 就用这些符号计算  . 首先取模块中出现 的实际表达式, 用 With 将每个局部变量的名称用所产生的符号代替, 然后模块来计算结果中表达式的值. 重要的是Module[vars, body] 仅将所产生的符号代入 的实际表达式中,但它不把这些符 号代入 所调用的但不直接出现在 中的代码中. 2.6.6 节将讨论如何用 Block 去建立以不同方式工作的 "局部值".

由于 x 没有直接出现在模块的 body 中,故没它的局部值

大部分情况下通过 Module[vars, body] 的直接输入来建立模块. 由于 Module 函数具有属性 HoldAll,所以在模块 执行之前  将维持不计算的状态. 在 Mathematica 中还可以建立动态 模块. 新符号的产生以及向 中的代入总是在模块执行时进行, 而不是在模块建立时进行.

这里立即计算模块的内部,直接给出 x 的值