| 保护式 | 成立条件 |
|---|---|
| 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优先级,以此类推。括号内的表达式优先求值。
优先级相同的运算符从左到右进行求值。