局部常量
| With[{x=x0,y=y0,...},body] | 定义局部常量 x,y, ... |
定义局部常量.
在 Module 中可以定义局部变量,这样我们可以对其赋值并且改变其值. 然而,通常我们所需要的是局部常量,对其我们仅需要赋值一次. Mathematica 中的 With 结构可以建立局部常量.
定义

的全局值.
| Out[1]= |  |
定义把

作为局部常量的函数.
使用定义

.
| Out[3]= |  |

仍然具有它的全局值.
| Out[4]= |  |
与模块 Module 中的情况相似,用 With 定义的初始值在 With 执行之前进行计算.
| Out[5]= |  |
With[{x=x0, ...}, body] 的工作方式是取 body,并用
代替 x,等等. 可以将 With 理解为
运算的推广,可适用于 Mathematica 的代码.
使用

替换

.
| Out[6]= |  |
替代以后,
With 的内容是

,故

得到了全局值

.
| Out[7]= |  |
清除

的值.
在某种意义上,With 类似于局部变量仅赋值一次的 Module 的特殊形式.
用 With 而不用 Module 的主要原因之一是使 Mathematica 程序容易理解. 在模块中的某一处遇到局部变量 x 时很可能需要跟踪整个模块的代码来得到 x 在该处的值. 而在 With 结构中,只需要观察初始值列表就能得到局部常量的值.
有几个 With 结构时,总是某一个变量最里面的一个起作用. 可以将 Module 和 With 混用. 一般原则是某一变量最里面的一个起作用.
在嵌套
With 结构中,总是最里面的一个起作用.
| Out[9]= |  |
| Out[10]= |  |
当名字不重合时,结构内的局部变量不屏蔽结构外的变量.
| Out[11]= |  |
除了 x 和 body 在何时计算外,With[{x=x0, ...}, body] 和
的做法基本类似. 然而,当表达式 body 内部都包含 With 或 Module 结构时, With 显示特殊的状态. 主要的问题是防止不同 With 结构中的局部常量相互冲突,或与全局目标冲突. 有关细节将在 "模块工作方式" 节讨论.
在
With 内部的

被重新命名以防止它与全局变量

冲突.
| Out[12]= |  |