您的位置:首页 > 其它

面对软件错误构建可靠的分布式系统_笔记02

2009-02-01 22:01 260 查看
3.3 Erlang顺序化编程
3.3.1 数据结构:8种原始的数据类型+2扩展类型
(1)整数integer:
(2)浮点数float:
(3)原子atom: 字母打头的小写字符串,类似枚举类型。如果单引号包括,则可以有空格:'a atom'
(4)二进制数binary: 二进制存储空间, <<1,2,3>>
(5)字符串:双引号包括的字符串 "cat",实质是ASCII码。比如"cat"实质为[97,99,116]
(6)引用reference:全局唯一的符号,只用来比较两个引用是否相等,可以调用mak_ref()生成
(7)Pid:进程标识符,由spawn()创建,是对进程的引用
(8)端口port:消息通过端口收发,必须遵守端口协议规则,通过open_port()创建

(9)元组tuple:包含固定个数的数据容器: {D1,D2,...Dn},这些参数类型不限。类似于数组
(10)列表list:可变个数的数据容器,[D1, D2, ...Dn], []为空列表,[Dh|Dt]第一个元素为表头,后面的为表尾
(11)记录:对元组提供了方便的访问方式,用名字,而不用序数表示元组某个元素
(12)匿名函数fun:函数包,表达式 fun(...) -> ... end. 创建

3.3.2变量
(1)大写字符串开头,可以包括数字和'_'线。
(2)要么未绑定,要么已经绑定,绑定后不能修改:
X = 5.
X1 = X + 10. 不能是 X = X + 10;

3.3.3 项式term与模式pattern
(1)模式匹配:

3.3.4保护式guard
(1)保护模式:类似if判断,关键字when
T1 二元运算符 T1 二元运算符:> < =< >= == /= =:= =/=
eg: {P, abc, 123} when P == G

3.3.5扩展模式匹配

3.3.6函数
规则:
(1) 整个函数由'.'结束,函数如果有多个"重载"形式(函数名称相同,函数模式不同),则由多个';'分隔的子句组成。
(2)一个子句组成: 头(模式) when 保护式 -> 函数体;
头模式由,分隔,函数体由','分隔, 保护式由,分隔
就是说: ,级别最低函数体内部用,;级别其次函数子句间用(receive模式匹配也用;),.最高函数结束用
头模式中的"_"表示匿名匹配,不会绑定变量,相当于忽略掉一项
FunctionName(P1, P2,...PN) when G1, G2, .. GN ->
Body1a,
Body1b,
Body1c;
FunctionName(Q1, Q2,... QN) when H1,H2,...HN ->
Body2;
FunctionName(R1, R2, ...RN) ->
Body3.
eg:
factorial(0) -> 1;
factorial(N) -> N * factorail(N-1).
eg: 取表达式 member(dog,[cat,man,dog,ape]);
member(H, [H1|_]) when H == H1 -> true; //相当于当列表前两个相同时,返回true,结束
member(H, (_|T]) -> member(H,T); //相当于如果前两个不同时,跳过一个,往下比较
member(H,[]) ->false; //列表结束后,返回false
整个函数,查找列表中是否有和待测元素相同的值
eg:
loop(Name, F, State) ->
receive
stop -> void; //相当于不同模式匹配,不同的函数处理,因此用;
{Pid, Query} -> {Reply, State1} = F(Query, State),
Pid ! {Name, Reply},
loop(Name, F, State1)
end.

3.3.7函数体
多个表达式时,最后一个的值是整个函数的返回值
eg:
deposit(Who, Money) ->
Old = lookup(Who),
New = Old + Money,
Insert(Who, New),
New.

3.3.8尾递归
以调用自己结尾的, 就是尾递归。常用在无限循环结构中,不消耗栈空间。
eg:非尾递归
factorial(0) -> 1;
factorial(N) -> N*factorial(N-1).
改为尾递归
factorial(N) -> factorial_1(N, 1).
facotrail_1(0, X) -> X;
factorail_1(N, X) ->factorial_1(N-1, X*N).

3.3.9特殊形式
case和if

3.3.10 case语句
case形式:
case Expression of
Pattern1 -> Expr_seq1;
Pattern2 -> Expr_seq2;
....
end.

3.3.11 if语句
if
Guard1 -> Expr_seq1;
Guard2 -> Expr_seq2;
......
end.
按顺序取值,如果Guard1返回true,则整个if返回,如果没有则继续Gurad2,如果全没有,则抛出异常
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: