Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7111967
  • 博文数量: 3857
  • 博客积分: 6409
  • 博客等级: 准将
  • 技术积分: 15948
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-02 16:48
个人简介

迷彩 潜伏 隐蔽 伪装

文章分类

全部博文(3857)

文章存档

2017年(5)

2016年(63)

2015年(927)

2014年(677)

2013年(807)

2012年(1241)

2011年(67)

2010年(7)

2009年(36)

2008年(28)

分类:

2012-08-07 00:54:49

数据类型
常量 数据类型--无法再分割更多原始类型的类型:
数值---    如123,-8,7.8e12,-1.2e-45,可以包括了整数与浮点数
Atom---    如abc,'An atom',monday,green,helloworld.它们都只是一些命名常量,可以以引号将一些特殊的字符引入进来。比如\n,\r,\t,\v\,\\
Pid----    进程标识用来存储进程
引用---    用于存储系统范围内唯一的引用
复合数据类型--  可用于组合其他数据类型。分两种
元组---    如{a,12,b}、{}、{a,b,c,d,e}元组用于存储固定数量的元素,类似于C里面的记录或结构体
列表---    如[],[a,b,12],[a,'fres']列表用于存储可变数量的元素类似于python里面的list。不是强类型的语言不像java里面的数组必须是要指定的数据类型. 
[E1,E2,E3,...,En|Variable] 用来标记一个前n个元素分别为E1,E2...En剩下部分为Variable的列表 。
变量: 总是以大写字母开头。
X = {
book,preface,{
{},[]
}
},
可以创建一个比较复杂的数据结构体然后再赋给这个变量的
匹配原语
表达式Pattern = Expression会进行模式匹配
>{A,B} = {[a],{x,y}}
>A.
[x]
可以用来拆分元素用
注意: _ 下划线代表一个特殊的匿名变量或无所谓变量,在语法要求需要一个变量但又不关心这个变量的取值它可以用来当占位符用。
{_,X}={A,B}
只当占位符
并发
spawn/3 启动一个并发进程,返回一个PID
Pid ! Msg 用于消息发送,Pid表示代表一个进程的身份标识,Msg代表要发送的消息
比如> foo(12) ! math:area({area,5})
表示对foo(12)取值,并对math:area({area,5})取值,然后会将计算结果当成一个消息发送给这个进程。
receive用于接收消息。语法如下
receive
   Message1 ->
...
   Message2 ->
end     ....
可以理解:send是将一条消息发送至一个进程的邮箱,而receive则是从当前进程邮箱中取出一条消息

创建一个返回任何发送给它的消息的each进程

点击(此处)折叠或打开

  1. -module(echo).
  2. -export([start/0,loop/0]).
  3. start() ->
  4. spawn(echo,loop,[]).
  5. loop()->
  6. receive
  7. {From,Message} ->
  8. From!Message,
  9. loop()
  10. end.
  11. %% Id = echo:start(),
  12. %% Id ! {self(),hello
模式匹配
{C,[Head|Tail]} = {[122,man],[a,b,v]}
C->{122,man}
Head->a
Tail->[b,v]
列表的这一点要注意一下

应用apply(Mod,Func,ArgList)实现的功能类似于lists:append([],[]).
import模块
比如:
-import(lists1,[reverse/1]).
类似于java里面的import语法 

项式比较
X>Y X大于Y
X
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这种的宏







阅读(245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~