纯函数和规则中的变量
用
Module 和
With 可以给出作为局部处理的符号名序列. 但有时需要直接将某些变量名进行局部处理.
例如,在使用
Function
等纯函数时,

是一个"形式参数",这个名称是局部的. 在规则

或定义

中出现的

也是这样.
Mathematica 用统一的方法去保证在纯函数和规则中出现的形式参数是局部的,且不与全局变量混淆. 其基本的思想是必要时用形如

的符号去代替形式参数. 作为一个约定,

从不用作全局变量名.
| Out[1]= |  |
Mathematica 重新命名函数内的形式参数

以避免与全局对象

冲突.
| Out[2]= |  |
| Out[3]= |  |
一般来说,在对象如
Function
中的形式参数当另一个纯函数修改了
body 时
Mathematica 就要重新命名.
由于纯函数内发生了变化,形式参数

就被重新命名.
| Out[4]= |  |
| Out[5]= |  |
Mathematica 在对纯函数中的形式参数重命名时比较自由. 原则上,函数中的形式参数与代换到纯函数中表达式的项不冲突时可以不用重新命名. 但为了一致起见,在这种情况下,
Mathematica 还是对形式参数重新命名.
这时,在函数内的形式参数

屏蔽了函数体,故不需要进行重命名.
| Out[6]= |  |
| Out[7]= |  |
| Out[8]= |  |
正如
"纯函数" 所述,
Mathematica 中纯函数类似于形式逻辑中的

表达式. 对形式参数重新命名使
Mathematica 纯函数再次产生标准

表达式的所有语法.
| Function[{x,...},body] | 局部参数 |
| lhs->rhs 和 lhs:>rhs | 局部模式名 |
| lhs=rhs 和 lhs:=rhs | 局部模式名 |
| With[{x=x0,...},body] | 局部常数 |
| Module[{x,...},body] | 局部变量 |
Mathematica 中的定界结构.
Mathematica 中有一些定界结构,其中某些名称作为局部量处理,当这些结构混合时,
Mathematica 进行适当的重命名以避免冲突.
Mathematica 重新命名纯函数中的形式参数以避免冲突.
| Out[9]= |  |
这里
With 内的局部参数被重新命名以避免冲突.
| Out[10]= |  |
这种情况下变量名之间没有冲突,故没有进行重新命名.
| Out[11]= |  |
在模块中局部变量

重新命名以避免冲突.
| Out[12]= |  |
执行模块时,局部变量又一次重新进行命名,以使得名称唯一.
| Out[13]= |  |
Mathematica 将变换规则当定界结构处理,其中模式的名称是局部的. 可以用

,

等或

建立命名的模式.
| Out[14]= |  |
在

等规则右端出现的

与名为

的模式匹配. 于是,

被当作规则的局部量处理,不能用其它定界结构去修改.
另一方面,

在规则中不是局部量,可以用其它定界结构去修改. 当这种情况发生时,
Mathematica 重新对规则中的模式命名以防止冲突.
Mathematica 对规则中的

重新命名以防止冲突.
| Out[15]= |  |
在一个定界结构中使用
With 时,
Mathematica 就自动地进行适当的重新命名. 但有时需要在定界结构中进行代换以免重命名. 这可以用

运算实现.
当用
With 代替

时,纯函数中的

被重新命名以防止冲突.
| Out[16]= |  |
当使用

而不是
With 时,没有进行这类重新命名.
| Out[17]= |  |
当使用规则如

或定义如

时,
Mathematica 必须间接地替换出现在表达式
rhs 中的
x,它用

运算有效地完成此项工作. 于是,这些替换不遵循定界结构. 然而,当定界结构的内部由替换修改后时,在定界结构中的其它变量被重新命名.
| Out[19]= |  |
此时,纯函数外的

被重新命名.
| Out[21]= |  |