块与模块的比较

当进行 Wolfram 语言编程时,应当尽量使它的项相互独立,这样程序就容易理解、维护和扩充.

保证程序中不同相相互不影响的一个重要途径是给它的变量一定的范围. Wolfram 语言用模块和块这两种机制来限制变量的范围.

在实际编程时,模块远远比块常用,而在相互作用的计算中需要确定范围时,往往是块比较方便.

Module[vars,body]词汇(lexical)定界
Block[vars,body]动态定界

Wolfram 语言变量的定界机理.

大部分计算机语言使用与 Wolfram 语言模块类似的词汇定界机理. 一些像LISP等符号计算语言与 Wolfram 语言块类似的动态定界机理.

在使用词汇定界时,变量在一个程序中的一个代码段被作为局部变量. 在动态定界时,在程序执行历史的一部分被作为局部值.

在 C 和 Java 等编译语言中, 它们的变量在使用之前就要声明类型,因此在编译前就已经确定了变量的类型;代码执行历史之间的区分非常明显. 而 Wolfram 语言属于动态类型语言,它的符号特性使这个区别不明显,其原因是代码在程序的执行过程中可以动态地生成.

Module[vars,body] 的作用是在模块作为 Wolfram 语言的代码被执行时处理表达式 body 的形式,并检查表达式,当任何 vars 明显地出现在代码中时,就被当作局部变量. 然后继续正常计算.

Block[vars,body] 不注意表达式 body 的形式. 而是,记录 vars 的当前值. 在 body 的全局计算过程中使用 vars 的局部值. 并且当计算 body 完成时,存储它们的初始值.

通过 来定义 .
In[1]:=
Click for copyable input
Out[1]=
在块内 的计算过程中, 用了局部值.
In[2]:=
Click for copyable input
Out[2]=
这里仅明显出现在 中的 被当作局部变量处理.
In[3]:=
Click for copyable input
Out[3]=