在本章中,我们将介绍Mathematica的那些特性,它们与过程式编程语言(例如c、c++、Fortran和Pascal)的特性最为接近。过程式编程是一种编程风格,其特点是大量的小步骤和普遍使用的副作用(例如,赋值给变量)在这些步骤之间传递信息。它还依赖于迭代(如,循环)来处理数据集合。一般来说,如果您看到赋值语句和循环,则样式是过程化的。
而大多数Mathematica专家不鼓励使用过程化程序,对于那些主要使用上述语言的编程人员来说,这是一个非常有用的工具,可以帮助他们学习Mathematica编程。请记住,本章所阐述的大多数技术都只是“冰山一角”;也就是说,它们是非常强大的概念的简单表现,我们将在接下来的章节中更详细地探讨这些概念。
函数
Mathematica函数是一种编程构造,它允许您以一种方便的方式重复使用代码段。Mathematica内置了数以百计的函数,比如Integrate、Table和Plot。但是Mathematica也让你很容易定义你自己的函数,它可以像系统提供的函数一样复杂。
函数定义
area[]:=Pi r^2
上面是面积的定义。左边是函数声明,右边是函数体。
参数
area[]:=Pi r^2
其中r是参数名,_表示空白,意为“fill in the blank”,表示r是个参数,而不是一个值。
类型检查
每个表达式有一个Head,可认为是类型。
本地变量
使用Module定义本地变量(作用域内会变),不会污染全局作用域:
Module[declarations,body]
使用With声明本地常量(作用域内不会变):
With[{name=expr},body]
Set vs SetDelayed
Set右边的表达式定义时立即执行;而SetDelayed右边的表达式调用时才执行。
返回值
使用Return或者最后一个表达式的结果作为返回值。
条件执行
Mathematica提供三种条件执行方法:If,Switch和Which。
If
类似if-else
If[test,if,else]
Switch
类似switch
Switch[x,a,do,b,do,c,do,_,do]
Which
类似if-elseif-elseif-…-else
Which[test1,do,test2,do,test3,do,True,do]
迭代
提供Do,While,For,没有返回值。
Do
返回Null
Do[body,{i,min,max,step}]
For
返回Null
For[initializer,test,increment,body]
While
返回Null
While[test,body]
控制流
Break,Continue,Return,Goto,Label,Abort,Throw,Catch。
参数传递语义
参数非本地变量
不能在函数体内部修改参数。
值传递
通过把参数赋给本地变量,进而修改本地变量。
名称传递
类似C语言的宏。
引用传递
Head为Symbol的参数。
高级主题:作用域
函数作用域、Module作用域、With作用域,这些都成为词法作用域。还有一种动态作用域,由Block提供。
词法作用域vs动态作用域
词法作用域中的变量是单独的变量,不和全局变量冲突。而动态作用域的变量可以暂时使全局变量失效。
嵌套作用域结构
With、Module和Block作用域可以嵌套使用,进行粒度更小的控制。