erlang教程:基础入门🔥编程基础🔥数据结构🔥递归🔥并发编程
elixir教程:基础入门🔥编程基础🔥模式匹配🔥递归枚举
基本类型
在erlang
中,基本的数据类型是数字Number
和原子Atom
,Number
又包括整数和浮点数。erlang
中提供了一些用于数值的函数
类别 | 函数 |
---|---|
三角函数 | sin, cos, tan, asin, acos, atan |
其他函数 | exp, log, abs |
类型函数 | float , is_float, is_integer |
前面提到,原子必须以小写字母开头,其实并不完全。通过单引号括起来的字符也可以当作原子。
Erlang
中有两个特殊的原子,即true
和false
,属于布尔类型。
此外,erlang
中还有位串、元组、映射、列表等类型,相对复杂,故放在后面讲解。
运算符
类别 | 运算符 | 备注 |
---|---|---|
算术 | + - * / rem div | rem 为求余;div 为取整 |
关系 | == , /= , < , =< , > , >= | /= 为不等号 |
逻辑 | and , or , not , xor | 对应与、或、非、异或 |
位运算 | band , bor , bnot , bxor | 对应与、或、非、异或 |
条件语句
erlang
中最容易理解的条件语句其实是case
,以下面代码为例
-module(testCase).
-export([case567/1]).
case567(A)->
case A of
5 -> io:fwrite("you input 5");
6 -> io:fwrite("you input 6");
7 -> io:fwrite("you input 7")
end.
编译之后结果如下
1> c("testCase").
{ok,testCase}
2> testCase:case567(5).
you input 5ok
3> testCase:case567(6).
you input 6ok
4> testCase:case567(7).
you input 7ok
5> testCase:case567(8).
** exception error: no case clause matching 8
in function testCase:case567/1 (testCase.erl, line 5)
看来不能输入8,而且貌似case
并没有default
的选项,但是没关系,erlang
提供了if
语句。或者更准确一点说,是提供了if
形式的case
语句,具体示例如下列代码所示
-module(testIf).
-export([bigger5/1]).
bigger5(A) ->
if
A == 5 ->
io:fwrite("A = 5");
A < 5 ->
io:fwrite("A < 5");
true ->
io:fwrite("A > 5")
end.
可以看到,所有语句块被包裹在if...end.
中,若a==5
,则输出"A = 5"
;如果a<5
,则输出"A < 5"
。最后的true
,可理解为无匹配选项,类似于C语言switch...case
中的default
,此时输出"A > 5"
。
调用结果如下
1> c("testIf.erl").
{ok,testIf}
2> testIf:bigger5(3).
A < 5ok
3> testIf:bigger5(5).
A = 5ok
4> testIf:bigger5(7).
A > 5ok
循环
erlang
语言中没有循环结构,所以不用学了。
但是等下,好像有什么不对,没有循环也配叫编程语言?
但仔细想想,for
循环要有一个i
,让这个i
不断增加,直到等于某一个值为止,但erlang
中不允许i
的值发生变化。while
循环虽然没有明说,但其判定条件也隐含了某个变量发生变化,最后导致条件由真变成了假。
换言之,erlang
没有循环结构是完全合理的。
但是,不要高兴得太早,erlang
可以通过递归来实现循环的功能,这个问题相对比较复杂,故放到后面再讲。