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入门
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.

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----刷新活动(定时器)

Erlang十分钟快速入门

Erlang十分钟快速入门

Erlang概述Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。

据说使用Erlang 编写的Yaws Web服务器,其并发性能是apache的15倍!这个Erlang初始开源版本包含了Erlang的实现,同时它也是用于构建分布式高可用性系统的Ericsson中间件的最大组成部分。

Erlang具有以下特性:并发性 - Erlang具有超强的轻量级进程,这种进程对内存的需求是动态变化的,并且它没有共享内存和通过异步消息传送的通讯。

Erlang支持超大量级的并发线程,并且不需要操作系统具有并发机制。

分布式 - Erlang被设计用于运行在分布式环境下。

一个Erlang虚拟机被成为Erlang节点。

一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点)。

一个Erlang节点能够创建运行在其它节点上的并行线程,而其它节点可以使用其它操作系统。

线程依赖不同节点之间的通讯,这完全和它依赖于单一节点一样。

健壮性 - Erlang具有多种基本的错误检测能力,它们能够用于构建容错系统。

例如,进程能够监控其它进程的状态和活动,甚至这些进程是在其它节点上执行。

在分布式系统中的线程能够配置为在其它节点故障的情况下自动进行故障恢复,并在故障节点恢复时自动迁移回到恢复节点。

软实时性 - Erlang支持可编程的“软”实时系统,这种系统需要反应时间在毫秒级。

而在这种系统中,长时间的垃圾收集(garbage collection)延迟是无法接受的,因此Erlang使用了递增式垃圾收集技术。

热代码升级 - 一些系统不能够由于软件维护而停止运行。

Erlang允许程序代码在运行系统中被修改。

旧代码能被逐步淘汰而后被新代码替换。

在此过渡期间,新旧代码是共存的。

这也使得安装bug补丁、在运行系统上升级而不干扰系统操作成为了可能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

这里所说的每一句都是准确的,但仍是真实的一小部分。

比如,我将只会告诉你最简单的语法,而不是所有详细的结构原理。

有很多极其简单的东西我会写上*manual*,这就表示这里有很多信息,你可以在Erlang相关的书中找到或是在<Erlang参考手册>中找得到。

我也假设这不是你每一次接触计机算,而且了解编程的最基本的思想。

不过不要着急,我并不会假定你是一个有经验的开发人员。

1.1.2 其它方面文章省略了以下几个方面:●参考●本地错误处理(cache/throw)●单向连接(显示器)●二进制数据处理●列表相关●与外界如何通信,以及/或者port其它语言开发的软件。

当然,有一些向导中会单独讲解这个问题。

<互操作向导>●涉及到的极少数Erlang库(如,文件处理)●关于OTP的问题完全被跳过,关于Mnesia数据库的信息在结论中也被省略。

●Erlang中的哈杀表。

●运行时改变代码。

1.2 顺序编程1.2.1 Erlang Shell大多数的操作系统有一个命令行解释器或一个Shell,U nix和L inux有很多,Windows 下有一个命令提示行。

Erlang也有它自己的Shell,你可以直接写比特(bits)或Erlang代码并评估(运行)它,以查看发生了什么。

(see shell(3))。

可以通过打开一个命令行解译器,并输入erl,以启动Erlang Shell(在L inux或U nix中)。

现在输入"2 + 5.",正如你下面看到的。

在Windows中,Shell可以通过双击Erlang Shell的图标打开。

你可能发现Erlang shell有很多行号(如 1> 2>),它们可以准确的告诉你2 + 5是7!同时也提示你,你应该通过一个终止符“.”和一个回车来结束你的输入。

如果你在shell中输入了错误的东西,在多数的shell中,你可以通过输入退格键(backspace)来删除他们。

同时在shell中也有很多编译命令的方式。

(See the chapter "tt y - A command line interface"在ERTS用户向导)。

(注意:你会发现在在向导会话中写的以及代码测试中,很多由shell给出的行号,并不是连续的)。

现在我们试着更复杂的计算。

在这里,你可以看到括号与乘法(*)、除法(/)的用法,就像在正常算数中的用法一样(See the chapter "Arithmetic Expressions" in the Erlang Reference Manual)。

退出Erlang系统和Erlang shell请输入Control-C。

你将看到如下的输出:输入"a"以退出Erlang系统。

另一个退出Erlang系统的方法是输入halt():1.2.2 模块和函数一个编程语言并不常用,如果你可以在shell中直接去行代码。

所以,这里是一个小型Erlang程序。

用一个合适的编辑器把它输入一个名为tut.erl的文件(文件名tut.erl 这一点很重要,同时需要确定文件与erl在同一个目录下)。

如果走运的话,你的编辑器可能支持Erlang模式,可以让你的开发容易一些,它可以格式化你的代码,让他们看起来更漂亮些。

(See the chapter "The Erlang mode for Emacs" in Tools U ser's Guide),不过没有它们,你仍然也可以将你的代码做得很完美。

下面是你将要输入的代码:不难猜出这段代码是用来求一个数的倍数的。

一会儿我们再回头来说关于前两行的事情。

我们先编译这个程序。

可以通过在你的Erlang shell下输入下面代码来实现:{ok,tut}告诉你编译成功。

如果它提示"error",你可能在输入文本的时候出错,并而错误信息可能会给你一些有关于如何纠正错误的想法,依此你可以改变你的代码,重新再试。

现在让我们运行这个程序。

一个预期的10的倍数是20。

现在我们回过头来看程序的前两行。

Erlang程序写在文件中。

每个文件都包含一个Erlang模块(Module)。

在文件中的第一行,就告诉我们模块的名称(See the chapter "Modules" in the Erlang Reference Manual)。

这告诉我们模块的名称是tut。

注意本行结尾的"."。

存放模块代码的文件的名字,也必须和模块同名但以".erl"做为扩展名。

在我们的例子中,文件名为tut.erl。

当我们使用另一个模块的函数,我们使用语法,模块名:函数名(参数)。

所以意味着我们调用tut模块中的double函数,并使用"10"做为参数。

第二行:说明tut模块包含一个名称为double的函数,并且带有一个参数(在我们的例子中为X)并而这个函数可以在tut模块以外被调用。

更多关于这个问题的说明,我们稍后再说。

应该再次注意这一行后面的"."。

下面给出一个更复杂的例子,一个数字的阶乘(如:4的阶乘是4*3*2*1)。

在名为tut1.erl中输入下面的代码。

-module(tut1).-export([fac/1]).fac(1) ->1;fac(N) ->N* fac(N - 1).编译这个文件现在计算4的阶乘。

第一部分:说明1的阶乘是1。

注意我们以一个";"结束这一部分,这说明这个函数没有结束。

每二部分:说明N的阶乘是,N与N - 1的阶乘的乘积(N!=N* (N - 1)!)。

注意这部分以"."结束,以说明本函数没有其它部分了。

一个函数可以有多个参数。

让我们扩展tut1模块,让他以比较笨的方式计算两数的乘积。

-module(tut1).-export([fac/1, mult/2]).fac(1) ->1;fac(N) ->N* fac(N - 1).mult(X,Y) ->X*Y.注意,我们同时也扩展了-export行,并给于它关于另一个带有两个参数的函数信息。

编译:试验:上面的例子的数值是整数,在函数功能代码中的参数N,X,Y被叫做变量。

变量首字母必须是大写(see the chapter "V ariables" in the Erlang Reference Manual)。

例如变量可以是N umber, ShoeSi z e, Age等等。

1.2.3 元子(Atoms)元子是在Erlang中的另一个数据类型。

元子以小写字母开头(See the chapter "Atom" in the Erlang Reference Manual),例如:charles, centimeter, inch。

元子只是一个简单的名字,其它什么都不是。

他们不像变量可以带有一个值。

来看下一个程序(文件:tut2.erl)用来把英寸转换成厘米或反过来。

-module(tut2).-export([convert/2]).convert(M, inch) ->M / 2.54;convert(N, centimeter) ->N* 2.54.编译:对于小数我不再多做解释了,我猜你可以理解。

看看如果我们输入centimeter和inch以外的参数给convert函数后会发生什么。

=ERROR REPORT==== 28-Ma y-2003::18:36:27 ===Error in process <0.25.0> with exit value:{function_clause,[{tut2,convert,[3,miles]},{erl_eval,expr,3},{erl_eval,expr s,4},{shell,eval_loop,2}]}** exited: {function_clause,[{tut2,convert,[3,miles]},{erl_eval,expr,3},{erl_eval,exprs,4},{shell,eval_loop,2}]}**convert函数的两个部分都调用了它的句话。

相关文档
最新文档