1.逗号(,)分隔函数调用,数据构造,和模式中的参数
例如:
表达式序列就是由一系列逗号分隔的表达式,他们在箭头之后,随处可见,如下图函数start_nano_server()->后面的就是表达式序列,这个表达式序列的值为seq_loop(listen)执行之后的值。seq_loop(Listen)->之后的同样是表达式序列,表达式序列在执行的时候,是一个一个来执行的,只要中间有一个失败,就会在这行报错,就不会往下接着执行。程序就退出,我们可以很清楚的了解程序在哪一行出错。
2.分号(;)分隔子句,像函数子句,模式匹配的子句,case表达式里面的子句,if表达式,try....catch 表达式,receive表达式。
我的个人理解是子句就是选择语句,可以进行选择,就是要么执行这个,要么执行那个。就是控制流程分支的。
2.1函数子句,同一函数的必须具备相同的函数名和相同的参数数量,且必须在同一处定义--不允许在同一函数的两个子句之间再插入其他函数定义。
如果这样写,两个相同名字的handle的函数子句之前用句号。
会报一下错误:
他们之间应该用分号(;)
area({circle,Radius})-> Radius*Radius*math:pi(); area({square,Side})-> Side*Side; area({rectangle,Height,Width})-> Height*Width.
2.2 case表达式里面的子句(要是Erlang里面只有函数子句这一种控制流程的方法,你就必须为程序中的每个小小的分支都取一个函数名。这样的做法太麻烦了,所以case也是可以控制分支的)
注意:让最后一个子句不要带分号(;)
例如
area(Shape)-> case Shape of {circle,Radius}-> Radius*Radius*math:pi(); {square,Side}-> Side*Side; {rectangle,Height,Width}-> Height*Width end.
2.3 if 表达式是case表达式的一种缩略模式,他不针对特定的值做分支判断也不含模式。
sign(N) when is_number(N)-> if N>0 ->positive; N<0 ->negative; true->zero end.
用case表达式如下:
sign(N) when is_number(N)-> case dummy of _ when N>0 ->positive; _ when N<0 ->negative; _ when true->zero end.
if表达式比较少用,因为Erlang大部分的分支判断或多或少依赖于模式匹配啊。