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

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,如果全没有,则抛出异常        
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值