正如在最近的一篇文章中所指出的那样,范围内的模块不能按预期工作.
该线程的一个例子是:
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*2 z*)
Run Code Online (Sandbox Code Playgroud)
但以下工作几乎与预期一致.
Module[{expr},
expr = 2 z;
Set@@{f[z_], expr};
f[7]]
(*14*)
Run Code Online (Sandbox Code Playgroud)
什么语言设计考虑使wolfram选择此功能?
编辑:请参阅Jefromi的第一条评论我将z从局部变量更改为not并忘记更改输出.它不会影响问题.
编辑2:Michael Pilat的观点似乎是Block和Module具有不同的功能.我想我理解他的观点,但我认为这与我的问题是正交的.所以这是一个更新.
我可以在笔记本中的全局级别使用以下代码:
expr = 2 z;
f[z_] = expr;
f[7]
(*output: 14*)
Run Code Online (Sandbox Code Playgroud)
但是当我将相同的代码块放入模块并使expr本地时,它会产生不同的输出.
Clear[f];
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*output: 2z*)
Run Code Online (Sandbox Code Playgroud)
如果跟踪上面的模块调用,则会发现Set [f [z_],expr]被重写为Set [f [z $ _,expr].现在这个z-> z $转换发生在Set的lhs和rhs上.然而,它在expr被评估之前发生,这导致在全局级别获得不同的结果.
只有当rhs具有Module调用的本地符号时,才会发生转换z-> z $.
为什么Mathematica选择在模块调用中更改此语法?做出这个决定的是什么语言/实现设计权衡.