2.6.3 模块工作方式Mathematica 中模块的基本工作方式非常简单. 任何模块每一次使用时,就产生 一个新符号去代表它的每一个局部变量. 新符号的名字被唯一地给定,它不能 跟任何其它名字冲突. 命名的方法是在给定的局部变量后加 $, 并给出唯一的序号. Mathematica中模块的基本原理 这里说明了模块内所产生 t 的符号
任何模块每一次运行时产生的符号不同
在绝大部分情况下,不需要直接涉及模块内产生的实际符号, 但在一个模块的执行过程中打开对话时就会看到这些符号. 同样, 用 Trace 等也能观察模块的计算. 用 Trace 观察模块内部产生的符号
Out[3]= |  |
在模块中打开对话 在对话内看到为 t 等局部变量产生的符号
Out[5]= |  |
可以象其它符号一样来处理这些符号
Out[6]= |  |
从对话返回
Out[4]= |  |
直接返回模块内产生的符号有时是方便的. 直接返回模块内所产生的符号
Out[5]= |  |
可以与其它符号一样处理这些符号
Out[6]= |  |
通过唯一的名称产生新符号 函数 Unique 与 Module 一样产生新符号,每次调用 Unique 时, $ModuleNumber 增加,故可保证新符号的名称不重复. 产生唯一的名称以 x 开头的 新符号
Out[7]= |  |
每调用一次 Unique 就得到一个序列号更大的符号
Out[8]= |  |
对一个集合调用 Unique,得到每个符号有相同的序列号
Out[9]= |  |
可以用 得到在模块中或用 Unique 函数产生符号的信息. 执行这一模块产生符号 q$nnn
Out[10]= |  |
这里可以看到所产生的符号
模块产生的符号与计算中的符号性能相同,但这些符号具有 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 中,故没它的局部值
Out[14]= |  |
大部分情况下通过 Module[vars, body] 的直接输入来建立模块. 由于 Module 函数具有属性 HoldAll,所以在模块 执行之前 将维持不计算的状态. 在 Mathematica 中还可以建立动态 模块. 新符号的产生以及向 中的代入总是在模块执行时进行, 而不是在模块建立时进行. 这里立即计算模块的内部,直接给出 x 的值
Out[15]= |  |
|