Erlang中的函数与流程控制介绍
一:函数
1:在Erlang中,【名字相同但参数数目不同】的两个函数是完全不同的函数。
2:其他模块内的函数用完全限定名称被调用:
-module(sort1).
-export([reverse_sort/1,sort/1]).
reverse_sort(L)->
lists1:reverse(sort(L)).
sort(L)->
lists:sort(L).
3:子句间以分号【;】分隔,在最后的结尾处以【.】结尾。
4:每个函数都由一组子句组成。子句间以分号“;”分隔。每个子句都包含一个子句头部、一个可选的保护式和子句主体。子句的头部包含一个函数名和一组以逗号分隔的参数当函数调用发生时,将会按顺序对函数定义中的子句头部依次进行匹配。对保护式求值时所有的断言都将被求值。若所有断言都为真,则保护式成立,否则就失败。保护式中各个断言的求值顺序是不确定的。
如果保护式成立,则会对子句的主体进行求值。如果保护式失败,则尝试下一个候选子句。一旦子句的头部和保护式都匹配成功,系统将指定这条子句并对其主体求值。子句首部模式与保护式的组合可以唯一确定一个正确的子句。
保护式断言的完整集合如下:
另外,一些BIF和算术表达式的组合也可以作为保护式。它们是:
element/2,float/1,hd/1,length/1,round/1,self/0,ze/1
trunc/1, tl/1,abs/1,node/1,node/0,nodes/0
可以出现在保护式中的项式比较运算符如下:
比较运算符工作机制如下:首先对运算符两边求值(如,在表达式两边存在算术表达式或包含BIF保护式函数时);然后再进行比较。
为了进行比较,定义如下的偏序关系:
number<atom<reference<port<pid<tuple<list
元组首先按大小排序,然后再按元素排序。列表的比较顺序是先头部,后尾部。
如果比较运算符的两个参数都是数值类型且运算符为coerce型,则如果一个参数是integer另一个是float,那么integer将被转换为float再进行比较。
exact类型的运算符则不做这样的转换。
因此5.0==1+4为真,而5.0=:=4+1为假。
保护函数子句示例:
foo(X,Y,Z)wheninteger(X),integer(Y),integer(Z),X==Y+Z->
foo(X,Y,Z)whenlist(X),hd(X)=={Y,length(Z)} ->
foo(X,Y,Z)when{X,Y,size(Z)}=={a,12,X}->
foo(X)whenlist(X),hd(X)==c1,hd(tl(X))==c2->
注意在保护式中不可引入新的变量。
二、流程控制
case语句
case表达式允许在子句主体内部于多个选项中进行选择,语法如下:
caseExprof
Pattern1[whenGuard1]->Seq1;
Pattern2[whenGuard2]->Seq2;
...
PatternN[whenGuardN]->SeqN
end
首先,对Expr求值,然后,Expr的值将依次与模式Pattern1、Pattern2……PatternN进行匹配,直到匹配成功。如果找到一个匹配并且(可选的)的保护式成立,则对应的调用序列将被求值。注意case保护式与函数保护式形式相同。case原语的值就是被选中的序列的值。
至少得有一个模式必须得以匹配——否则就会产生一个运行时错误并引发第??章中的错误处理机制。
举个例子,比方说我们我有个函数allocate(Resource)用于分配某种资源Resource。假设这个函数只返回{yes,Address}或no。这样,这个函数便可以放在一个case结构里:
...
caseallocate(Resource)of
{yes,Address}whenAddress>0,Address=<Max->
Sequence1...;
no->
Sequence2...
end
...
在Sequence1...中,变量Address已经被绑定在了allocate/1的返回结果上。
为了避免匹配错误的发生,我们常常追加一个必会匹配的模式作为case原语的最后一个分支:
caseFnof
...
_->
true
end
IF
if表达式的语法如下:
if
Guard1->
Sequence1;
Guard2->
Sequence2;
...
end
在这种情况下,保护式Guard1,...将被依次求值。如果一个保护式成立则对与之关联的序列求值。该序列的求值结果便是if结构的结果。if保护式与函数保护式形式相同。与case相同,一个保护式都不成立的话将引发一个错误。如果需要,可以增加保护式断言true作为垃圾箱:
if
...
true->
true
end
算术表达式
算术表达式由以下运算符构成:
单目运算符有一个参数,双目运算符有两个参数。混合意味着参数即可以是integer也可以是float。单目运算符的返回值与其参数类型相同。
双目混合运算符(即*、-、+)在参数都是integer时返回类型为integer的对象,在参数至少包含一个float时返回一个float。浮点除法运算符/总是返回一个float。
双目整数运算符(即band、div、rem、bor、bxor、bsl、bsr)的参数必须是整数,其返回值也是整数。
求值顺序取决于运算符的优先级:首先计算第1优先级的运算符,然后是第2优先级,以此类推。括号内的表达式优先求值。
优先级相同的运算符从左到右进行求值。
相关文章
- 第五章·自动化运维工具-Ansible流程控制
- 漫谈项目质量保障——协作流程优化
- hostapd中beacon流程
- 软件测试工作流程概括与总结[通俗易懂]
- 流程控制-循环控制
- 流程控制
- java基础:流程控制篇
- Dart 知识点 - 流程控制语句
- 互联网大厂服务端测试流程
- xhs-web校验流程分析
- Python 运算符与流程控制
- BPMN2.0是什么?它能解决企业流程管理中哪些问题?
- Shell编程从看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)
- 离谱!面试都这么问?那不得满分回答,谈谈你对Swagger工作流程的理解?
- Python 流程控制与循环体
- rust语言流程控制
- 一步一腳印的 iOS App 上架和更新流程
- 腾讯云HiFlow是什么?如何配置一个自动化流程?
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
- Java Activiti6.0 spring5 SSM 工作流引擎 审批流程 java项目框架详解编程语言
- python全栈开发-Day2 布尔、流程控制、循环详解编程语言
- Go 从入门到精通(三)字符串,时间,流程控制,函数详解编程语言
- 强化Linux定时任务精确控制流程(linux定时时间设置)
- Shell exit流程控制语句及用法
- 《Python3.6官方文档》– 4.更多流程控制语句
- MySQL中if流程控制简介(MySQL中if流程控制)
- php学习之流程控制实现代码
- PHP基础学习之流程控制的实现分析
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记