本篇是Erlang的基本操作和概念介绍。

基本概念

一次性赋值的变量

一个变量在未绑定的时候,可以接受任何值,但是一旦被绑定,就会永远保留它。

变量的作用域是它定义时所处的语汇单元。

变量绑定和模式匹配

Lsh = Rhs

计算右侧的值,然后结果与左侧的模式相匹配。

如果左侧是一个未绑定变量,就可以匹配任何值,并且绑定这个值。否则匹配右边的值,满足就成立,否则匹配失败。

浮点数

给整数做除法,结果会自动编程浮点数。要想从除法中获取整数,使用div 和rem.

% div代表舍去余数
% rem代表取余操作
5 div 3     % 1
5 rem 3     % 2

模块与函数

函数

函数的扩展

  1. 调用函数的时候,会从第一个与调用参数匹配的字句开始。
  2. 不处理模式匹配失败的情形,会以一个运行时错误结束。

基本的抽象单元 fun

操作其他函数的函数被称为高阶函数,代表的数据类型是fun

Double = fun(X) -> X * 2 end.
TempConvert = fun({c,C}) -> {f,32+C*9/5};
                ({f,F}) -> {c,(F-32)*5/9}
              end.

返回fun的函数

% 调用func1 返回一个检测列表成员的函数func2
Func1 = fun(L) -> (fun(X) -> lists:member(X,L) end) end.
Func2 = Func1(L).
Func(2).

关卡

% when后面的表达式符合则匹配表达式1 否则匹配表达式2
max(X,Y) when X > Y ->
    X;
max(X,Y) ->
    Y;

关卡序列

单一或者一系列的关卡。分号分隔。只要有一个关卡为true,它的值就为true.

单一或者一系列的关卡。逗号分隔。只有所有关卡为true,它的值才为true.
合法的关卡表达式:

1. 原子true
2. 其他常量(数据结构和已绑定变量),都会成为false
3. 一些其他的关卡函数和一些内置函数
4. 数据结构比较
5. 算术表达式
6. 布尔表达式
7. 短路布尔表达式

true关卡的作用就是处理一些默认情况。

条件判断表达式

case表达式

case Expression of
    Pattern1 [when Guard1] -> Expr_seq1;
    Pattern2 [when Guard2] -> Expr_seq2;
    ...
end

执行过程如下:

1. Expression被执行,得到值Value
2. Value轮流与带关卡的Pattern进行匹配,直到匹配成功
3. 一旦匹配成功,对应的表达式序列就会执行,执行的结果就是case表达式的值
4. 所有模式都不匹配,发生异常错误

if表达式

if Guard1 ->
    Expr_seq1;
   Guard2 ->
    Expr_seq2;
   ...
end

执行过程如下:


1. 首先执行Guard1,如果得到值为true,if的值就是Expr_seq1得到的值
2. 如果Gurad1不成功,就执行Guard2,直到成功
3. 至少要有个关卡结果是true,否则会异常错误
* 很多时候,最后一个关卡都是原子true,保证最后都会执行

符号

  1. 逗号分隔函数调用、数据构造和模式中的参数
  2. 分号分隔字句,例如函数定义,case、if...try...catch和receive表达式
  3. 句号(后接空白)分隔函数整体,以及shell里的表达式
  4. 中缀插入操作符 ++ 把左边的列表和右边的列表元素合到一起(会重复元素)
  5. 列表移除操作符 -- 从左边列表里移除右边列表里面的元素

操作符

  1. andalso 短路求值,只要有一个不满足条件就返回false,否则为true
  2. and 非短路求值,满足所有条件才为true,否则为false。每个条件都会判断
  3. orelse 短路求值,只要有一个满足条件就返回true,只要满足就返回
  4. or 只要有一个条件为true,结果就是false

构建自然顺序的列表

构建列表最有效率的方式是向某个现成列表的头部添加元素。

归集器比以下类型结构的版本更节省空间
[H||filter(H)]
文章目录