相关疑难解决方法(0)

为什么Mathematica会破坏模块中的正常范围规则?

正如在最近一篇文章中所指出的那样,范围内的模块不能按预期工作.

该线程的一个例子是:

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选择在模块调用中更改此语法?做出这个决定的是什么语言/实现设计权衡.

programming-languages wolfram-mathematica

7
推荐指数
2
解决办法
924
查看次数