数字
四则运算
1> 2 + 15. 17 2> 49 * 100. 4900 3> 1892 - 1472. 420 4> 5 / 2. 2.5 5> 5 div 2. 2 6> 5 rem 2. 1
进制
10> 2#101010. 42 11> 8#0677. 447 12> 16#AE. 174
变量
值不可改变
首字母必须大写
_或_开头的变量,相当于哑元,可以用来接值,但不会保存数据。
原子
小写字母开头的标识符,或''包含的数据是原子数据。
原子数据放在原子表中,不会被垃圾收集。原子数据增加时,会持续消耗内存直至用尽内存或声明了1048577个原子数据。因此不要动态生成原子数据。
关键字不能用作原子数据。
布尔代数与比较符
布尔
1> true and false. false 2> false or true. true 3> true xor false. true 4> not false. true 5> not (true and true). false
and/or会对两端表达式求值,要使用短路逻辑,应该使用andalso/orelse。
判断相等
6> 5 =:= 5. true 7> 1 =:= 0. false 8> 1 =/= 0. true 9> 5 =:= 5.0. false 10> 5 == 5.0. true 11> 5 /= 5.0. false
判断不等
12> 1 < 2. true 13> 1 < 1. false 14> 1 >= 1. true 15> 1 =< 1. true
与C++不同,1与true并不相等,0与false也不相等。
实际上,不同类型有下面的比较关系
number < atom < reference < fun < port < pid < tuple < list < bit string
元组
格式:{元素1,元素2,……,元素N}
1> X = 10, Y = 4. 4 2> Point = {X,Y}. {10,4} 3> Point = {4,5}. {4,5} 4> {X,Y} = Point. {4,5} 5> X. 4 6> {X,_} = Point. {4,5} 7> {_,_} = {4,5}. {4,5} 8> {_,_} = {4,5,6}. ** exception error: no match of right hand side value {4,5,6} 10> PreciseTemperature = {celsius, 23.213}. {celsius,23.213} 11> {kelvin, T} = PreciseTemperature. ** exception error: no match of right hand side value {celsius,23.213} 12> {point, {X,Y}}. {point,{4,5}}
列表
格式:[元素1,元素2,……,元素N]
列表可以放任意数据
1> [1, 2, 3, {numbers,[4,5,6]}, 5.34, atom].
[1,2,3,{numbers,[4,5,6]},5.34,atom]
如果元素全是可打印的ASCII值,那么显示的结果有点尴尬
2> [97, 98, 99].
"abc"
“并”、“差”操作
5> [1,2,3] ++ [4,5]. [1,2,3,4,5] 6> [1,2,3,4,5] -- [1,2,3]. [4,5] 7> [2,4,2] -- [2,4]. [2] 8> [2,4,2] -- [2,4,2]. []
“并”、“差”操作是右结合的
9> [1,2,3] -- [1,2] -- [3]. [3] 10> [1,2,3] -- [1,2] -- [2]. [2,3]
使用BIFs(内建函数)来获取列表数据
11> hd([1,2,3,4]). 1 12> tl([1,2,3,4]). [2,3,4]
以上两个函数取数据时,使用这个匹配模式:[头|尾]。
"|"称为构造操作符。
13> List = [2,3,4]. [2,3,4] 14> NewList = [1|List]. [1,2,3,4] 15> [Head|Tail] = NewList. [1,2,3,4] 16> Head. 1 17> Tail. [2,3,4] 18> [NewHead|NewTail] = Tail. [2,3,4] 19> NewHead. 2
适当列表&非适当列表
适当列表的最后一个单元是一个空列表。
当以“[2]”这样的形式来声明列表时,列表被构造成一个适当的列表。
而以"[1|2]”方式声明时,将构造一个非适当列表。
非适当列表用来匹配[head|tail]没有问题,但无法用于内建函数。
因此“[1|2]”应声明成“[1|[2]]”。
列表推导式
列表推导式格式:列表 = [表达式 || 生成表达式1,生成表达式2,……,生成表达式N,条件1,条件2,……条件M]
生成表达式格式:样式 <- 列表
3> RestaurantMenu = [{steak, 5.99}, {beer, 3.99}, {poutine, 3.50}, {kitten, 20.99}, {water, 0.00}]. [{steak,5.99}, {beer,3.99}, {poutine,3.5}, {kitten,20.99}, {water,0.0}] 4> [{Item, Price*1.07} || {Item, Price} <- RestaurantMenu, Price >= 3, Price =< 10]. [{steak,6.409300000000001},{beer,4.2693},{poutine,3.745}] 5> [X+Y || X <- [1,2], Y <- [2,3]]. [3,4,4,5]
位操作
二进制数据放在“<<”和“>>”中间。
二进制数据的格式:
值
值:大小
值/类型声明列表
值:大小/类型声明列表
类型声明列表包含的元素:
类型。可选值: integer | float | binary | bytes | bitstring | bits | utf8 | utf16 | utf32
符号。可选值:signed | unsigned
端。可选值:big | little | native
单位。格式:unit:integer
元素之间用“-”连接
3> Pixels = <<213,45,132,64,76,32,76,0,0,234,32,15>>. <<213,45,132,64,76,32,76,0,0,234,32,15>> 4> <<Pix1,Pix2,Pix3,Pix4>> = Pixels. ** exception error: no match of right hand side value <<213,45,132,64,76,32,76, 0,0,234,32,15>> 5> <<Pix1:24, Pix2:24, Pix3:24, Pix4:24>> = Pixels. <<213,45,132,64,76,32,76,0,0,234,32,15>>
只想匹配开头的数据时,可以使用语法糖
8> <<R:8, Rest/binary>> = Pixels. <<213,45,132,64,76,32,76,0,0,234,32,15>> 9> R. 213
二进制推导式
二进制生成列表
1> [ X || <<X>> <= <<1,2,3,4,5>>, X rem 2 == 0]. [2,4]
列表生成二进制
4> << <<R:8, G:8, B:8>> || {R,G,B} <- RGB >>.
<<213,45,132,64,76,32,76,0,0,234,32,15>>