前面一篇high level地介绍了Erlang语言在并发编程上的特点。本文详细介绍Erlang的基本语法:
在Erlang语法中,跟java或c有相当大的差异,跟以往我学过的任何语言(c,pasacal,vb,delphi,php,groovy,python)有巨大的不同,前面的语言要么是基于过程的,或者基于面向对象的,而Erlang是面向消息的或者说是基于函数的。
在语法要素方面,变量有两种状态,要么绑定(已赋值),要么未绑定,一旦被赋值,就不能再赋值,任何变量都可以看成是不可变的,有点像java中的final变量。
变量类型:
1.整型, 比如 1,2,3
2.浮点型, 比如 1.0,3.0e12
3.字符串,严格意义讲是整型变量的list。"abc" 和 [97,98,99]一样
4.原子(atoms),就像字面量,由小写字母开头的字符组成,也可以用单引号扩住,以便于定义以大写字母开头的字符列表,有点像java中枚举类型,c中的常量,他们是全局有效的,比如abc, color,name,red等等
5.元组(tuple),像c的struct,像java的纯值对象,像js对象(或者json对象),他是由基本的整型,浮点型,原子,项,及元组和列表等类型组成的附和类型。不要和python中的tuple混淆,他们之间完全不一样。
6.列表(List),就像java中LinkedList或python中的list,大小可变的,列表由两部分组成头和尾,[H|T],H是列表头,T代表列表尾,列表尾要求是一个列表。列表的定义是用[]形式表示。
7.引用(reference),和java,C++及大多数面向对象语言中的引用是一样的,比如,X={1,3},Y=X,X和Y都是只向相同的数据,变没有拷贝一份出来。
8. 匿名变量,匿名变量用“_”表示,主要用在赋值中剔除想用的值,比如 {x,_,Y}={1,3,5},可以只取元组中的第一个值和第3个值并赋值给x,y
我们可以看出来,上面这些类型都是跟数据相关的,我们的消息都应该由这些数据类型组成。
9.二进制(binarry),一个二进制数是一个字节序列。二进制数为二进制数据的存贮提供了一种高空间效率的方法
10.pid,我们知道,Erlang语言的特点是要基于进程的,进程之间的通信是基于消息的,要发消息必须知道对方的进程id
11.端口(port),端口用于与外界通信,由内置函数(BIF3)open_port来创建。消息可以通过端口进行收发,但是这些消息必须遵守所谓“端口协议” (port protocol)的规则
12. 匿名函数(fun)——匿名函数是函数闭包4,由表达式“fun(…) -> … end.”来创建
变量赋值(模式匹配 Pattern Matching):
严格意义或者官方资料上,没有赋值的说法,只是模式匹配的提法很容易与正则表达式容易混在一起,而实际上用赋值的方式理解这种模式匹配还是容易理解的。比如{X,Y}={1,3},变量X被赋值为1,Y被赋值为3,但是,如果X或者Y任何一个变量已经赋过值都会抛错。
模式匹配涉及两个概念:Pattern 和 Term
pattern可以看成是各种类型变量,而Term可以看成是一个都已经赋值过的变量或常量组成,进行模式匹配相当于python中的元组赋值。
以下是模式匹配的例子:
Pattern Term Result
{X,abc} {123,abc} 成功 X → 123
{X,Y,Z} {222,def,"cat"} 成功 X → 222, Y → def,Z → "cat"
{X,Y} {333,ghi,"cat"} 失败—the tuples have different shapes
X true 成功 X → true
{X,Y,X} {{abc,12},42,{abc,12}} 成功 X → {abc,12}, Y → 42
{X,Y,X} {{abc,12},42,true} 失败—X cannot be both {abc,12} and true
[H|T] [1,2,3,4,5] 成功 H → 1, T → [2,3,4,5]
[H|T] "cat" 成功 H → 99, T → "at"
[A,B,C|T] [a,b,c,d,e,f] 成功 A → a, B → b,C → c, T → [d,e,f]