程序1.1
函数可以通过shell程序进行交互式求值。 Shell会提示输入一个表达式,并计算和输出用户输入的任意表达式,例如:
- > math1:factorial(6).
- 720
- > math1:factorial(25).
- 15511210043330985984000000
以上的“>”代表 shell 提示符,该行的其他部分是用户输入的表达式。之后的行是表达式的求值结果。
factorial 的代码如何被编译并加载至 Erlang 系统中是一个实现相关的问题。
在我们的例子中,factorial函数定义了两个子句:第一个子句描述了计算factorial(0)的规则,第二个是计算factorial(N)的规则。当使用某个参数对factorial进行求值时,两个子句按照它们在模块中出现的次序被依次扫描,直到其中一个与调用相匹配。当发现一个匹配子句时,符号->右边的表达式将被求值,求值之前函数定义式中的变量将被代入右侧的表达式。
程序1.2是该规则的一个示例。
程序1.2
函数double/1可在模块外被求值[2],times/2则只能在模块内部使用,如:
- > math2:double(10).
- 20
- ** undefined function: math2:times(5,2) **
在程序1.2中模块声明-module(math2)定义了该模块的名称,导出属性-export([double/1])表示本模块向外部导出具备一个参数的函数double。
函数调用可以嵌套:
程序1.3
- -module(math3).
- -export([area/1]).
- area({square, Side}) ->
- Side * Side;
- X * Y;
- area({circle, Radius}) ->
- 3.14159 * Radius * Radius;
- area({triangle, A, B, C}) ->
- S = (A + B + C)/2,
- math:sqrt(S*(S-A)*(S-B)*(S-C)).
如我们所期望的,对math3:area({triangle,3,4,5})得到6.0000而math3:area({square,5})得到 25 。程序1.3 引入了几个新概念: