保护式 | 成立条件 |
---|---|
atom(X) | X 是一个原子式 |
constant(X) | X 不是列表或元组 |
float(X) | X 是一个浮点数 |
integer(X) | X 是一个整数 |
list(X) | X 是一个列表或 [] |
number | X 是一个整数或浮点数 |
pid(X) | X 是一个进程标识符 |
port(X) | X 是一个端口 |
reference(X) | X 是一个引用 |
tuple(X) | X 是一个元组 |
binary(X) | X 是一段二进制数据 |
另外,一些BIF和算术表达式的组合也可以作为保护式。它们是:
运算符 | 描述 | 类型 |
---|---|---|
X > Y | X 大于Y | coerce |
X Y | X 小于Y | coerce |
X = Y | X 小于或等于Y | coerce |
X >= Y | X 大于或等于Y | coerce |
X == Y | X 等于Y | coerce |
X /= Y | X 不等于Y | coerce |
X =:= Y | X 等于Y | exact |
X =/= Y | X 不等于Y | exact |
比较运算符工作机制如下:首先对运算符两边求值(如,在表达式两边存在算术表达式或包含BIF保护式函数时);然后再进行比较。
为了进行比较,定义如下的偏序关系:
元组首先按大小排序,然后再按元素排序。列表的比较顺序是先头部,后尾部。
如果比较运算符的两个参数都是数值类型且运算符为coerce型,则如果一个参数是integer另一个是float,那么integer将被转换为float再进行比较。
exact类型的运算符则不做这样的转换。
因此5.0 == 1 + 4为真,而5.0 =:= 4 + 1为假。
保护函数子句示例:
二、流程控制
case语句
case表达式允许在子句主体内部于多个选项中进行选择,语法如下:
至少得有一个模式必须得以匹配——否则就会产生一个运行时错误并引发第??章中的错误处理机制。
举个例子,比方说我们我有个函数allocate(Resource)用于分配某种资源Resource。假设这个函数只返回{yes, Address}或no。这样,这个函数便可以放在一个case结构里:
在Sequence 1 ...中,变量Address已经被绑定在了allocate/1的返回结果上。
为了避免匹配错误的发生,我们常常追加一个必会匹配的模式作为case原语的最后一个分支:
IF
if表达式的语法如下:
算术表达式
算术表达式由以下运算符构成:
运算符 | 描述 | 类型 | 操作数类型 | 优先级 |
---|---|---|---|---|
+ X | + X | 单目 | 混合 | 1 |
- X | - X | 单目 | 混合 | 1 |
X * Y | X * Y | 双目 | 混合 | 2 |
X / Y | X / Y (浮点除法) | 双目 | 混合 | 2 |
X div Y | X 整除Y | 双目 | 整数 | 2 |
X rem Y | X 除以Y 的余数 | 双目 | 整数 | 2 |
X band Y | X 与Y 的位与 | 双目 | 整数 | 2 |
X + Y | X + Y | 双目 | 混合 | 3 |
X - Y | X - Y | 双目 | 混合 | 3 |
X bor Y | X 与Y 位或 | 双目 | 整数 | 3 |
X bxor Y | X 与Y 的位算数异或 | 双目 | 整数 | 3 |
X bsl N | X 算数左移N 位 | 双目 | 整数 | 3 |
X bsr N | X 右移N 位 | 双目 | 整数 | 3 |
单目 运算符有一个参数,双目 运算符有两个参数。混合 意味着参数即可以是integer 也可以是float 。单目运算符的返回值与其参数类型相同。
双目混合运算符(即* 、- 、+ )在参数都是integer 时返回类型为integer 的对象,在参数至少包含一个float 时返回一个float 。浮点除法运算符/ 总是返回一个float 。
双目整数运算符(即band 、div 、rem 、bor 、bxor 、bsl 、bsr )的参数必须是整数,其返回值也是整数。
求值顺序取决于运算符的优先级:首先计算第1优先级的运算符,然后是第2优先级,以此类推。括号内的表达式优先求值。
优先级相同的运算符从左到右进行求值。