X =< Y x小于或等于y
X >= Y x大于或等于Y
X == Y x等于y
X /= Y x不等于y
X =:= y x等于y 精确?
x =/= y x不等于y exact?
如果类型为coerce型进行比较的话就会进行类型转换如果是exact类型的就不比较,比如
5.0 == 1+4为真
5.0 =:= 1+4 不为真
原语:case和if两种
Case类似于switch
比如:
case Expr of
Pattern1 [when guard] -> seq1;
Pattern2 [when guard] -> seq2;
...
PatternN [when guardN] -> seqN
end
比如:
case allocate(Resource) of
{yes,Address} when Address > 0,Address =< Max ->
Sequence 1....;
no ->
Sequence 2...
end
IF语句
if
Guard1 ->
Sequence1;
Guard2 ->
Sequence2;
...
end
列表编程
列表的标记[E1,E2,..En|Variable],其中的n>=1,用于表示前n个元素为E1,E2,..En其余部分为Variable的列表。当n=1的时候列表的形式为[H|T];这个形式出现的频率高通常叫H为列表的头部,T表示为尾部
注意:处理固定数目元素时应用使用元组;因为元组占用的存储空间仅是列表的一半且访问速度很快。要需要处理可变数量的元素时才使用列表。
下面列了几个常用的BIF
atom_to_list(A)
将原子式A转换为一个ASCII字符列表
如atom_to_list(hello)->[104,101,108,108,111]
float_to_list(F)->将浮点数F转换成一个ASCII字符列表
integer_to_list(I)
list_to_atom(L)->将ASCII字符列表L转换成一个原子式
list_to_float(L)
list_to_integer(L)
hd(L)->返回列表L的第一个元素。如hd([a,b,c,d])->a
tl(L)->返回列表的L的尾部。tl([a,b,c,d])=>[b,c,d]
length(L)->返回列表L的长度.length([a,b,c])->3
常用的列表处理函数
这里面的函数都定义在lists模块里面。
member(X,L)-> 表示X是否在列表L里面如果在就返回true
append(A,B)-> 连接两个列表A和B.比如append([],L)->L.append([H|L1],L2) -> [H|append(L1,L2)]
reverse(L)-> 用于颠倒列表L中元素的顺序.reverse(L)->reverse(L,[])
delete_all(X,L) 用于删除列表L中出现的所有X
集合
new() 返回一个空集合
add_element(X,S) 返回将元素X并入集合S产生的新集合
del_element(X,S) 返回从集合S中删除元素X新集合
is_elemet(X,S)
is_empty(S) 集合S是否为空
union(S1,S2) 返回集合S1与S2的并集
intersection(S1,S2) 返回交集
集合:一个不包含重复元素的无序列表
函数式编程[map,filter]
map(Func,List)-> 返回一个列表L
filter(Pred,List)-> 对列表List中的元素进行过滤仅保留Pred为TRUE的元素
-------->
元组
常用的BIF
tuple_to_list(T) 将元组T转化成一个列表
list_to_tuple(L) 将列表转化成一个元组
element(N,T) 返回元组T的第N个元素
setelement(N,T,Val) 返回一个新的元组,这个元组是将元组T的第N个元素用Val替换之后的一个拷贝
size(T) 返回元组T包含的元素个数
字典
new() 创建并返回一个空字典
lookup(Key,Dict) 在字典Dict中查找一个Key-Value对如果找到则返回{value,Value}否则返回undefined
add(Key,Value,Dict) 添加一个新的Key-Value对到字典Dict中并返回一个新的字典
delete(Key,Dict) 从字典Dict里面删除Key所对应的Key-Value对并返回一个新的字典
并行编程
Pid = spawn(Module,FunctionName,ArgumentList)
往进程发送消息
Pid ! Message
接收消息:
receive
Message1 [when Guard1] ->
Actions1;
Message2 [when Guard2] ->
Action2;
end
只接收某个特定进程的消息
只希望能够接收某一个特定进程的消息。可以让消息发送者必须显式地在消息中包含自己的进程标识符
Pid | {self(),abc}
self() 返回当前进程的标识符。接收逻辑:
receive
{Pid,Msg} ->
...
end
头文件与记录、宏
记录定义: -record(name_of_record,{field_name1,field_name2,...}).
例如:
-record(message_to,{to_name,message}).
等效于
{message_to,To_Name,Message}
创建一个记录的最好的办法:
#message_to{message="hello",to_name=fred}
比如 :
-record(mysql_result,
{
fieldinfo=[],
rows=[],
affectedrows=0,
error=""
}
).
宏
-define(server_node,messnger@super).
那在mess_server.erl中包含文件:
-include("mess_config.hrl").
这样在这个erl文件中全部的server_node将被替代
比较常用的宏比如?MODULE,?LINE这种的宏