GetHelpBrowserLocationMetaTag Rest LinkTrail Tags First Null
Mathematica 9 is now available
 /

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 的值



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.