Erlang入门

合集下载

Erlang入门手册

Erlang入门手册

Erlang/OTP R11B 文档Erlang/OTP R11B documentationv0.1a2目录第1部分 入门 (1)1.1 简介 (1)1.1.1 简介 (1)1.1.2 其它方面 (1)1.2 顺序编程 (1)1.2.1 Erlang Shell (1)1.2.2 模块和函数 (3)1.2.3 元子(Atoms) (6)1.2.4 元组 (7)1.2.5 列表 (8)1.2.6 标准模块及用户手册 (11)1.2.7 将输出写到终端上 (11)1.2.8 一个更大的例子 (12)1.2.9 变量的匹配、守卫和作用域 (14)1.2.10 更多关于列表 (16)1.2.11 If和Case (21)1.2.12 内建函数(BIFs) (25)1.2.13 复杂函数 (27)1.3 并行编程 (29)1.3.1 进程 (29)1.3.2 信息传递 (31)1.3.3 进程名称注册 (35)1.3.4 分布式编程 (36)1.3.5 一个更大的例子 (40)1.4 [#1]健壮性(Robustness 鲁棒性) (49)1.4.1 超时(Timeouts) (49)1.4.2 错误处理 (51)1.4.3 增强健壮性之后的大型例子 (54)1.5 [#1]记录和宏(Records and Macros) (59)1.5.1 将大型的例子分割在多个文件中 (59)1.5.2 头文件(Header Files) (64)1.5.3 记录(Records) (64)1.5.4 宏(Macros) (65)第2部分 OTP设计原则 (66)2.1 概述 (66)2.1.1 监督树 (66)2.1.2 Behaviour (66)2.1.3 应用 (70)2.1.4 发布 (71)2.1.5 发布控制 (71)2.2 Gen_Server Behaviour(文档缺失) (71)2.3 Gen_Fsm Behaviour (71)2.3.1 有限状态机 (71)2.3.2 实例 (72)2.3.3 启动一个Gen_Fsm (73)2.3.4 事情通知 (74)2.3.5 超时 (74)2.3.6 All状态事件 (75)2.3.7 停止函数 (75)2.3.7.1 在监督树中 (75)2.3.7.2 独立Gen_Fsm (76)2.3.8 处理其它消息 (76)2.4 Gen_Event Beheaviour (77)2.4.1 事件处理原则 (77)2.4.2 实例 (77)2.4.3 启动一个事件管理器 (78)2.4.4 加入一个事件处理器 (78)2.4.5 事件通知 (79)2.4.6 删除一个事件处理函数 (80)2.4.7 停止 (80)2.4.7.1 在监督树中 (80)2.4.7.2 独占式事件管理器 (80)第1部分 入门1.1 简介1.1.1 简介这是一个入门指导教你开始使用Erlang。

Erlang编程基础

Erlang编程基础

Erlang编程基础Erlang是一种广泛用于并行和分布式应用程序的编程语言。

它是由瑞典电信公司Ericsson在20世纪80年代末到90年代初开发的,旨在解决电信系统在高度并发的情况下的通信和容错问题。

在过去的几十年里,Erlang 已经成为了编写高可靠、高并发的系统的首选语言之一。

Erlang的语法类似于Prolog,但也有类似于C语言的结构,并且支持面向对象的编程风格。

最重要的是,Erlang具有非常独特的并发模型,可以轻松地编写响应快速的服务器和分布式应用程序。

下面我们将介绍Erlang编程的基础知识。

1. 变量与类型在Erlang中,变量是以小写字母开头的单词或下划线组成的标识符,例如:```X = 1.Y = \"Hello, world!\".```Erlang中的主要数据类型包括整数、浮点数、布尔值、字符串和列表。

整数和浮点数的语法与C语言类似。

布尔值只有两个值:true和false。

字符串使用双引号括起来,例如:\"Hello, world!\"。

列表是相同或不同类型元素的列表,例如:[1, 2, 3]和[\"Alice\", \"Bob\", \"Charlie\"]。

2. 函数和模块Erlang是一种函数式编程语言,函数是Erlang编程的核心。

函数包括一个名称、参数列表和函数体,例如:```add(A, B) ->A + B.```这个函数将两个整数相加并返回其和。

函数定义以箭头符号(->)结束。

在Erlang中,函数通常分组到称为模块的文件中。

一个模块包含一组相关的函数和常量。

使用-module指令定义模块的名称,以及-export指令指定模块中可供其他模块使用的函数。

例如,以下是一个名为math的模块,定义了一个名为add的函数:```-module(math).-export([add\/2]).add(A, B) ->A + B.```要在其他Erlang代码中使用此模块中的函数,可加载该模块并调用函数:```-module(client).-compile(export_all).start() ->math:add(1, 2).```在这个例子中,我们定义了一个名为start的函数,加载了math模块,并调用了它的add函数。

Erlang语法学习笔记 变量、原子、元组、列表、字符串 电脑资料

Erlang语法学习笔记 变量、原子、元组、列表、字符串 电脑资料

Erlang语法学习笔记变量、原子、元组、列表、字符串电脑资料这篇文章主要介绍了Erlang语法学习笔记:变量、原子、元组、列表、字符串,本文简明了这5种类型的相关知识,需要的朋友可以参考下1. erlang中的变量【单一赋值】,意味着变量只能赋值一次,2.变量必须【大写字母】开头。

原子相当于c++中的枚举类型,但erlang中的原子的值是其本身。

原子是一串以【小写字母】开头的,但如果用单引号引起来,原子的命名就无所谓了,很多把戏就出来了。

如果首字符是正轨的小写字母,那么原子的值是引号内的内容,否那么输出的值包含单引号。

有很多项组成一个单一的实体,类似于c++中的构造体之类的,在erlang中要用元组表示;将假设干个以【逗号】分隔的值用【花括号】括起来就是一个元组。

{rex,1.71} 这个元组包含一个原子和一个浮点值。

元组与c++中的构造比起来是匿名的,但erlang中不能以点号来操作,创立一个元组就是直接给一个变量绑定一个元组,因为元组中的元素没有名字,所以只能我们记住这些元素的用处。

通常情况下我们用一个原子作为元组的第一个元素来说明这个元组所代表的含义。

{point,10,45}来代替{10,45},这是一种编程风格。

元组可以嵌套。

譬如:代码如下:Person={person,{name,rex},{height,1.72},{footsize,43},{eyecolor,brown}}.表示一组人的信息,注意是使用原子作为标签。

元组声明即自动创立,不再使用就随之销毁,有垃圾回收。

新元组引用了一个已绑定的变量,那就会享有这个变量引用的数据构造。

应用没定义的变量会出错!例子:代码如下:F = {firstname,rex}.L = {lastname,yuan}.P = {person,F,L}.p的值就是{person,{firstname,rex},{lastname,yuan}}=不是赋值,是模式匹配,是erlang的根底,如果想从元组中提取内容:声明一个相同类型的元组,要取的值用变量来代替,变量哦!!!然后用=模式匹配去取出来对应变量的值例如:代码如下:Point = {point,10,43}.{point,X,Y} = Point.X和Y的值分别就为10,43.位于等号两边的元组必须含有相同数量的元素,注意模式匹配。

Erlang入门手册

Erlang入门手册

Erlang/OTP R11B 文档Erlang/OTP R11B documentationv0.1a2目录第1部分 入门 (1)1.1 简介 (1)1.1.1 简介 (1)1.1.2 其它方面 (1)1.2 顺序编程 (1)1.2.1 Erlang Shell (1)1.2.2 模块和函数 (3)1.2.3 元子(Atoms) (6)1.2.4 元组 (7)1.2.5 列表 (8)1.2.6 标准模块及用户手册 (11)1.2.7 将输出写到终端上 (11)1.2.8 一个更大的例子 (12)1.2.9 变量的匹配、守卫和作用域 (14)1.2.10 更多关于列表 (16)1.2.11 If和Case (21)1.2.12 内建函数(BIFs) (25)1.2.13 复杂函数 (27)1.3 并行编程 (29)1.3.1 进程 (29)1.3.2 信息传递 (31)1.3.3 进程名称注册 (35)1.3.4 分布式编程 (36)1.3.5 一个更大的例子 (40)1.4 [#1]健壮性(Robustness 鲁棒性) (49)1.4.1 超时(Timeouts) (49)1.4.2 错误处理 (51)1.4.3 增强健壮性之后的大型例子 (54)1.5 [#1]记录和宏(Records and Macros) (59)1.5.1 将大型的例子分割在多个文件中 (59)1.5.2 头文件(Header Files) (64)1.5.3 记录(Records) (64)1.5.4 宏(Macros) (65)第2部分 OTP设计原则 (66)2.1 概述 (66)2.1.1 监督树 (66)2.1.2 Behaviour (66)2.1.3 应用 (70)2.1.4 发布 (71)2.1.5 发布控制 (71)2.2 Gen_Server Behaviour(文档缺失) (71)2.3 Gen_Fsm Behaviour (71)2.3.1 有限状态机 (71)2.3.2 实例 (72)2.3.3 启动一个Gen_Fsm (73)2.3.4 事情通知 (74)2.3.5 超时 (74)2.3.6 All状态事件 (75)2.3.7 停止函数 (75)2.3.7.1 在监督树中 (75)2.3.7.2 独立Gen_Fsm (76)2.3.8 处理其它消息 (76)2.4 Gen_Event Beheaviour (77)2.4.1 事件处理原则 (77)2.4.2 实例 (77)2.4.3 启动一个事件管理器 (78)2.4.4 加入一个事件处理器 (78)2.4.5 事件通知 (79)2.4.6 删除一个事件处理函数 (80)2.4.7 停止 (80)2.4.7.1 在监督树中 (80)2.4.7.2 独占式事件管理器 (80)第1部分 入门1.1 简介1.1.1 简介这是一个入门指导教你开始使用Erlang。

erlang学习1

erlang学习1

消息的发送
pid ! Message 将消息发给Pid所标识的进程,消息发送 是异步发送的。发送者执行时不会阻 塞,不需等待会继续执行后边的代码 执行后返回Message,这样你就可以用 类似 Pid1 ! Pid2 ! Pid3 ! Message的方 式,给三个进程发送消息
消息接收
receive Pattern1 [when GuardSeq1] -> Body1; ...; PatternN [when GuardSeqN] -> BodyN after ExprT -> BodyT end
一个简单的TCP客户端
需求
建立一个TCP连接到一个WEB服务器 将服务器返回的数据显示出来
先来代码
发_tcp:connect gen_tcp:send
c re
simple_client
gen_tcp
msg queue
ei ve
创造进程
创建一个新的进程,新进程执行Fun函数 pid=spawn(Fun) 将进程号注册成通用的名字 register(name, Pid)) 将自己的进程号(self())参数传给新进的 进程
一步一个脚印
格式化输出
2> io:format("~p~n",[A]). <<"HTTP/1.0 403 Forbidden\r\nServer: CachePower/1.3.1.dev\r\nMime-Version: 1.0\r\nDate: Tue, 25 Dec 2007 01:44:38 GMT\r\nContent-Type: text/html\r \nContent-Length: 1059\r\nExpires: Tue, 25 Dec 2007 01:44:38 GMT\r\nX-SquidError: ERR_ACCESS_DENIED 0\r\nX-Cache: MISS from \r \nConnection: ...... HREF=\"mailto:webmaster\">webmaster</A>. \n\n\n<BR clear=\"all\">\n<HR noshade size=\"1px\">\n<ADDRESS>\nGenerated Tue, 25 Dec 2007 01:44:38 GMT by (CachePower/1.3.1.dev)\n</ADDRESS>\n</BODY></ HTML>\n">> ok

Erlang初学Erlang的一些特点和个人理解总结电脑资料

Erlang初学Erlang的一些特点和个人理解总结电脑资料

Erlang初学:Erlang的一些特点和个人理解总结 -电脑资料这篇文章主要介绍了Erlang初学:Erlang的一些特点和个人理解总结,本文总结了函数式编程、一切都是常量、轻量进程、进程端口映射及典型缺点等内容,需要的朋友可以参考下我对 Erlang 编程理念的理解:以分布式架构师的角度写代码,Erlang初学:Erlang的一些特点和个人理解总结函数式编程Erlang 里面的函数是数学里面的函数:必须有返回值。

只要是函数必然有返回值,函数是一个过程,以英文的句号为函数结束符。

函数结束之前的表达式就是该函数的返回值。

所以这也是在 Erlang 里面的函数不会看到任何 return 语句的原因。

C++ 等其他语言的函数和函数之前可以通过共享变量来实现消息传递。

Erlang 里面的函数不可以,消息的传递通过函数的传入和传出。

也只是为什么 Erlang 号称天生之处并行处理的原因,因为他们不共享变量,也就不需要加锁。

很多人听到函数式编程都会觉得高大上或者晦涩难懂。

因为函数是编程没有for 循环语句,但是在我看来,关键在于会使用【列表推倒】和【尾递归】来进行循环遍历。

说到函数式编程就会拿快速排序说事,下面这个示例是 Erlang 版本的快速排序:代码如下:-module(sort).-export([qsort/1]).qsort([]) -> [];qsort([Pivot | T]) ->qsort([X || X <- T, X < Pivot]++ [Pivot] ++qsort([X || X <- T, X >= Pivot]).非常简洁,[Pivot | T] 就是拿列表的第一个元素当快排中的 Pivot 。

代码如下:[X || X <- T, X < Pivot]上式就是【列表推导】,含义就是找出列表 T 中所有元素小于 Pivot 中的元素组成一个新的列表。

Erlang第一课----基本变量

Erlang第一课----基本变量

Erlang第⼀课----基本变量1、(in Erlang shell)A sequence of expressions must be terminated with a period followed by whitespace; otherwise, it won't be executed. You can separate expressions with commas, but only the result of the last one will be shown.2、Erlang shell中调试程序时,如果job僵掉了,可以⽤ctrl+G-> i -> c中断僵掉的job并连接到第⼀个job(这⾥不确定是第⼀个还是最后⼀个,待进⼀步确认)。

ctrl+G进⼊任务管理器后,h是打印帮助菜单。

3、变量名第⼀个字母必须是⼤写;或者以下⾯线(_)开始,但是⼀般⽤来标⽰这个变量只是写来看的,我们后⾯不会再⽤,即don't care one。

4、变量不能进⾏第⼆次赋值,除⾮是赋同⼀个值。

更准确来说,并不能说这是赋值,应该叫bound,即绑定;所以,我们完全可以把这⾥的Variable当做是别名,⽽且是被element唯⼀拥有的。

ps:在shell中,如果你给某个变量赋错了值,你可以使⽤f(Variable).来对其进⾏擦除;使⽤f().,即不带参数时,表⽰擦除所有变量。

另外,该flush函数只有在shell中有。

ps: 还有这些也是常⽤的:1)h(). ⽤来打印最近的20条历史命令。

2)b(). 查看所有绑定的变量。

3) e(n). 执⾏第n条历史命令。

4) e(-1). 执⾏上⼀条shell命令5、变量命名不能以⼩写开始的原因是,还有另外⼀种类型的数据叫atom。

每个atom关联了⼀个atom table,atom table在32为系统中占⽤4bytes内存,在64位系统中占⽤8个bytes内存;如果不是内存被⽤光或者是atoms的数量达到1048577,这些内存是不会被回收的,直到程序结束。

erlang入门项目经验分享

erlang入门项目经验分享
3、涉及到同一条数据被多个人同时操作需要对该数据进行锁定,以免发生 脏数据的现象。zm_db_client:lock(Table,key,Lock,LockTime,Timeout)。 4、使用原子时能节约的就节约。上限数量为1 M。 5、使用方法要恰当,节省空间和时间。 6、需要数据时再取,以免取了却不用,浪费了资源。 7、注释,必须写清楚,方便以后做维护。
3
逻辑代码的严谨、简练、可读性
manager
1、检查参数需严谨,前台数据不能信。
2、逻辑判断要周全,防止玩家钻空子。
3、数据存取要小心,同时同步需事务。
4、先付款后再到货,检查消耗要灵活。
5、更数据、写日志、抛bi,根据需求做推送,一一做全不能少。
3
注意事项总结
1、语言包,注意加前缀。
2、多条表同时被操作时,写事务,保证数据的同步同时性,事务内的事情 越少越好,只做逻辑判断和数据修改,因为锁数据的时间越短越好。Leabharlann erlang编程入门经验分享
前后台大体的通信流程
01
CONTENTS
后台代码的整体组成
02
逻辑代码块的严谨、简洁
03
目 录
注意事项总结
04
1
前后台大体的通信流程
2
后台代码的整体组成
port ----前后台沟通的端口
db----数据库get,set,delete
manager----port的逻辑 update----向前台推送 zm_session:send event----抛事件,bi等 zm_event:notify log----记日志,方便发现问题 zm_log:info timer----刷新活动(定时器)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Pid ! Message RegName ! Message {RegName, Node} ! Message
• 进程接收消息
receive Pattern1 [when Guard1] -> Exp1; Pattern2 [when Gurad2] -> Exp2; …… end
进程注册
• 注册进程名 register( AnAtom, Pid) • 取消进程注册明 unregister(AnAtom)
34>>
模式匹配
• 变量不变 • 等号非等号 • 例子
X = 5. {X, Y} = {5, abc}. [5, abc, Z] = [X, Y, 8]. [H|T] = [1, 2, 3,4]. [A,B,C|T1] = [a,b,c,d,e,f]. {_, X} = {3, 45}.
模块和函数
• 变量作用域:只能存在于函数内;函数参数对应 的变量,从执行函数开始直到函数结束;函数内 定义的匿名函数,会屏蔽所在函数的同名变量。 /blog/315452
数据类型
• • • • • • • 浮点数 整数 原子 元组{} : 列表[] : 字符串: 二进制: <<14, 14, $a, 45>>, <<“abc123”>>, <<“abc”, 12,
• 参考:
/otp-design-principles/index.html
gen_server框架
• 外部接口函数:
启动服务: gen_server:start_link/4 2.请求服务: gen_server:call/2, gen_server:cast/2, ! 1.
• Start_child过程
参数形式不一样,一个是start_child(Sup, Spec),调用erlang:apply(M,F,Args).;另一 个是 start_child(Sup, Args),调用erlang:apply(M,F,Args++A).
• 参考资料:
/me-sa/archive/2012/01/10/erlang0030.html /zhangjingyangguang/article/details/6599435 +++ /blog/232618 /uid-429659-id-3381064.html
并发编程部分
• • • • 进程 OTP Mnesia 监控树
并发原语
• 新建进程
Pid = spawn(Fun) Pid = spawn(Mod, Func, Args ) Pid = spawn(Node, Func) Pid = spawn(Node, Mod, Func, Args)
• 向进程发送消息
• 模块(参考hello.erl)
-module(hello). %% 声明本模块的名称,并且和文件名同名 -export([greeting/0]). %% 声明导出的函数名称和参数个数 -include(“myrecord.hrl”). %% 声明包含的其它文件 greeting() -> io:format( "~s~n" , ["Hello!"] ).
Hale Waihona Puke • If语法ifGuard1 -> Exp1; Guard2 -> Exp2; …… end
记录
• 范例: -record(todo, {status=reminder,who=joe,text}).
其它
• 异常处理: try…catch • 转义处理: $ • 函数引用: fun FuncName/Argc • 宏定义: -define(POLL_TIMEOUT, 200). • 下划线变量 _X
电信和金融领域
• 开源项目:rabbitmq, yaws, ejabberd, etc
顺序编程部分
• • • • • • • • • • • 变量 数据类型 模式匹配 模块 函数 列表处理 断言 表达式 if/case 记录 其它
变量
• 自由变量 X = 100. X = 200. • 非自由变量 • 命名规范:大写字母开头+ 字母/数字/下划线
Erlang入门
引言
• 起源:
Erlang是一种通用的面向并发的函数式编程语言,它问世于1987年,由瑞典电 信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并 发活动的编程语言和运行环境。 特性:分布式、并发性、健壮性、软实时性、热代码替换、函数式、动态脚 本语言
• 应用:
• 模块编译
模块和函数
• 常规函数 参考area.erl • 匿名函数:可以作为函数的参数,也可作 函数返回值。 Double = fun(X) -> 2 * X end. F=fun( X ) -> ( fun(Y) -> X*Y end ) end. • 函数引用: F = fun modName:funName/Argc.
列表处理
• 运算符:++, -• 简单列表处理
参考libutils.erl
• 列表解析 L= [2, 3, 4]. R = [ 2 * X|| X <- L].
断言
• 断言
是一种用于强化模式匹配的结构,可以在一个模式上作简单的变量测 试和比较。
• 简单断言
is_integer(X) is_atom(X) is_function(X) ……
one_for_one和simple_one_for_one
• Start_link过程
都会调用本模块的init()函数,但是one_for_one策略是根据子规范启动 完所有子进程,才返回; 而simple_one_for_one并不启动子进程就返回, 子进程是后续用start_child根据子规范启动的。
• 断言序列
见libutils.erl
• when断言
函数定义的开头, 配合if和case使用.
表达式
• • • • 算数表达式 比较表达式 布尔表达式 块表达式
CASE/IF
• Case语法
case Expression of Pattern1 [when Guard1] -> Exp1; Pattern2 [when Gurad2] -> Exp2; …… end
链接进程
• • • • link() / unlink() spawn_link() Erlang:monitor(process, Pid ) exit()
分布式原语
• • • • • node() nodes() monitor_node() is_alive() ……
OTP入门
• OTP概述 • gen_server框架 • supervisor框架
• 回调函数接口
init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3
my_bank.erl • 参考:
/lqg1122/article/details/7484413
Supervisor入门
• Supervisor:
实际上是基于gen_server的系统进程,监控子进程的状态 并设置一定的重启机制.
• 范例:
见nextim_sup.erl, nextim_client_sup.erl
重启机制
• one-for-one : 把子进程当成各自独立的,一个进 程出现问题其它进程不会受到崩溃的进程的影 响.该子进程死掉,只有这个进程会被 • one_for_all : 如果子进程终止,所有其它子进程 也都会被终止,然后所有进程都会被重启. • rest_for_one:如果一个子进程终止,在这个进程 启动之后启动的进程都会被终止掉.然后终止 掉的进程和连带关闭的进程都会被重启. • simple_one_for_one 是one_for_one的简化版 , 所有子进程都动态添加同一种进程的实例
OTP概述
• OTP:
发布于1996年的应用程序开发框架—开放电信平台
• 主要框架:
Gen_server: 提供C/S架构中服务端的实现 Gen_event: 提供事件处理功能 Gen_fsm: 提供有限状态机的实现 Supervisor: 实现监督树中的监督者 Application: 应用打包框架
Mnesia数据库
应用程序
相关文档
最新文档