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补丁、在运行系统上升级而不干扰系统操作成为了可能。

学习Erlang--1、入门

学习Erlang--1、入门

学习Erlang--1、⼊门1、正式起航从前,⼀名程序员偶然读到了⼀本古怪的语⾔图书,相等其实不是相等,变量其实是不能改变的,语法是那么陌⽣,它甚⾄不是⾯向对象,这些程序实在是太过另类……另类的不仅仅是程序,编程的教学步骤也特⽴独⾏,它的作者⼀直喋喋不休地教授并发、分布和容错,不断的唠叨着⼀种叫COP(Concurrency Oriented Programming,⾯向并发编程)的⽅法,管它叫什么……不过有些程序看起来很好玩,那天夜⾥,这个程序员注视着那个聊天程序的⼩例⼦,它是多么的⼩巧可爱⽽⼜通俗易懂,它确实简单到不能再简单了,⽤不了⼏⾏代码,⽂件共享和加密通信便跃然⽽上,于是这个程序员开始敲起了他的键盘……上⾯这段话⾮常简单有趣,⽽⼜把Erlang的特点很好的带了出来,使我和那个提到的程序员⼀样,开始了我的Erlang之旅。

2、Erlang安装在Erlang的官⽅⽹站可以找到它的安装程序,由于我的是windows系统,所以我直接进⼊Download页⾯,找到下载就⾏了。

等下载好之后的安装也⾮常简单,直接next就⾏,完成后就可以在开始菜单找到这么⼀个东东,打开后就能看到这个就是我们得Erlang的⼀个模拟器了,当然,使⽤windows的cmd或者unix下的bash在命令提⽰符下输⼊erl来启动Erlang shell--erl也是⼀样的。

我们尝试⼀下,如下图输⼊提⽰符 1> 说明这是我们的第⼀个命令,% 号后⾯跟着的是注释⽂字,它表⽰此⾏都是Erlang的注释,会被shell和Erlang编译器忽略。

第⼆⾏输⼊20+30,然后回车,没有出结果?因为在Erlang中是以 “. + 回车”来表⽰⼀个完整命令的结束的,所以第三⾏还是提⽰的1>,表⽰我们的第⼀个命令还是没结束,然后我们输⼊ “.”和回车,这时候shell会对表达式求值,并打印出结果,50.然后显⽰的提⽰符就编程2>,表⽰我们下⾯开始的就是第2个Erlang命令了。

erlang基础知识集锦

erlang基础知识集锦

Erlang基础知识集锦声明:此文档只作为对erlang的认知之用,如果需要学习并使用erlang 请系统学习介绍erlang的书。

1.简介●Erlang是一个并行编程语言和运行时系统,最初由爱立信(Ericsson)于1987年为电信行业所开发。

1998年爱立信在改良的MPL(Mozilla Public License)许可下将Erlang发布于开源社区。

●Erlang是:a)一种“小众”语言。

b)一种函数式语言(变量只能赋值一次)。

c)一种动态类型语言(变量类型在运行时决定,代码需要编译后才能执行,与Python,Ruby等不一样)。

d)一种强类型语言。

e)一种面向并发(Concurrency Oriented)的语言。

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

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

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

●软实时性- Erlang支持可编程的“软”实时系统,使用了递增式垃圾收集技术。

●热代码升级-Erlang允许程序代码在运行系统中被修改。

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

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

●递增式代码装载-用户能够控制代码如何被装载的细节。

●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。

3.数据类型3.1.变量3.1.1.在erlang中的变量只能被赋值一次,变量第一个字母要是大写的。

3.1.2.符号”=”是值类型匹配操作(带有赋值的意思)。

(pattern matching)3.1.3.在erlang中变量是不可变的,也没有共享内存的概念,也没有锁。

3.2.浮点数3.2.1.整数除法示例: 4 div 2。

3.2.2.求余示例: 5 rem 2。

史上最完整的erlang环境配置

史上最完整的erlang环境配置

Erlang环境配置1.安装erlang运行时。

直接双击运行otp_win32_R16B02.exe,按照提示一步步安装即可。

2.安装java运行时。

直接双击运行jre-7u5-windows-i586.exe,安装提示一步步安装即可。

3.安装eclipse。

将压缩包eclipse-standard-kepler-SR1-win32.zip解压到任意目录下即可。

4.安装erlide插件。

将erlide目录下的所有文件拷贝到eclipse解压所在目录,并修改link目录下的.link文件里面的路径名,使指向plus目录下的插件(注:路径中不能有中文出现), ok.5.配置erlide。

在菜单上依次选择[Window]->[preference],在左边选择栏找到[Erlang]->[Installed runtimes],然后点击右边的[add]按钮,选择你安装Erlang的路径,如果你有多个Erlang安装版本可以依次设置。

6.新建工程。

在菜单上依次选择[File]->[New]->[Project],然后选择[Erlang]->[Erlang Project]。

填写Project Name,比如“ElTest”,余下的按默认设置,点击[Next],最后是[Finish]。

7.新建module。

在左边新建的project里右键点击[src],选择[new module],在弹出的窗口里填入以下信息。

Module name:TestContainer:/ElTest/src (默认)Application name:None (默认)Skeleton:None (默认)在最下面的两个输入框里输入say(这个是方法名)和0(参数个数),然后点击[Apply]按钮。

最后点击[finish]按钮。

编辑新生成的module如以下代码1.%% Author: WQF2.%% Created: 2008-11-93.%% Description: TODO: Add description to test4.-module(test).5.6.%%7.%% Include files8.%%9.10.%%11.%% Exported Functions12.%%13.-export([say/0]).14.15.%%16.%% API Functions17.%%18.19.%%20.%% TODO: Add description of say/function_arity21.%%22.say() ->23. io:format("hello, world\n").24.25.26.%%27.%% Local Functions28.%%%% Author: WQF%% Created: 2008-11-9%% Description: TODO: Add description to test-module(test).%%%% Include files%%%%%% Exported Functions%%-export([say/0]).%%%% API Functions%%%%%% TODO: Add description of say/function_arity%%say() -> io:format("hello, world\n").%%%% Local Functions%%8.配置运行project右键点击Project,依次选择[run as]->[run configurations],在弹出的窗口,右键点击左边一览的[Erlang application],选择[new]。

《Erlang编程指南》学习笔记

《Erlang编程指南》学习笔记

第一章引言并发进程和消息传递并发是Erlang成功的根本,Erlang不提供共享内存的线程,而是每个Erlang进程都在它自己的内存空间里执行,并拥有它自己的堆和栈。

进程之间不能随意相互干扰,而这在线程模型中很容易发生,从而极易导致死锁和其他可怕的事情。

进程之间通过消息相互交流。

第二章Erlang基础变量Erlang中的所有函数变量调用都是按值调用的:在函数被求值之前,所有的函数调用参数都已经被求值。

在Erlang中不存在引用调用的概念,这避免了引用调用导致的一些边界效应。

Erlang的所有变量都是局部的,不存在全局变量。

Erlang内存管理Erlang中的存储管理是自动的,垃圾收集的实现是以每个进程为基础:当一个处理器没有更多的内存用于存储的时候,就会自动触发垃圾收集器。

垃圾回收器是以代相传的,这意味着它有几代的堆(在Erlang中是两代)。

垃圾回收器可以是浅的或者深的,一个浅的回收器只查看最新的数据,所有数据如果从三次的浅垃圾回收器中生存下来,就会把它移动到老一代中去。

模式匹配=表示一个模式匹配操作。

Lhs=Rhs实际上是这样一个过程:对右端求值,然后将结果与左端进行模式匹配。

Erlang会问自己“要怎么做才能让这个语句的值变为true?”。

所以对变量可以多次赋相同的值。

_ 变量不绑定,值匹配不匹配没关系。

_Xxx 变量绑定,且未使用并不发出警告。

模块指令使用import指令可能使你的代码难以理解,可能会不分清是本地函数还是文件头部导入的。

因此,尽量少用导入语句在Erlang社区里面是个约定的习俗。

第三章 Erlang顺序编程case结构Erlang所有表达式都有一个返回值。

case结构的结果就是最后一个表达式的运行结果,case表达达的结果必须和一个模式匹配,否则将会得到一个运行时错误。

创建暂时的组合数据类型可以减少缩进(模式匹配组合项)。

变量范围Erlang中一个变量的范围是在相同函数中变量被绑定后一任意位置。

erlang参考手册(英文)

erlang参考手册(英文)

erlang参考手册(英文)Erlang Reference Manualversion5.6Typeset in L A T E X from SGML source using the DocBuilder-0.9.8Document System.Contents1Erlang Reference Manual11.1Introduction (1)1.1.1Purpose (1)1.1.2Prerequisites (1)1.1.3Document Conventions (1)1.1.4Complete List of BIFs (1)1.1.5Reserved Words (2)1.1.6Character Set (2)1.2Data Types (2)1.2.1Terms (2)1.2.2Number (2)1.2.3Atom (3)1.2.4Bit Strings and Binaries (3)1.2.5Reference (3)1.2.6Fun (4)1.2.7Port Identi?er (4)1.2.8Pid (4)1.2.9T uple (5)1.2.10List (5)1.2.11String (6)1.2.12Record (6)1.2.13Boolean (7)1.2.14Escape Sequences (7)1.2.15Type Conversions (7)1.3Pattern Matching (8)1.3.1Pattern Matching (8)1.4Modules (8)1.4.1Module Syntax (8)1.4.2Module Attributes (9)1.4.3Comments (11)iiiErlang Reference Manual1.5Functions (11)1.5.1Function Declaration Syntax (11) 1.5.2Function Evaluation (12)1.5.3Tail recursion (13)1.5.4Built-In Functions,BIFs (13)1.6Expressions (13)1.6.1Expression Evaluation (14)1.6.2Terms (14)1.6.3Variables (14)1.6.4Patterns (15)1.6.5Match (16)1.6.6Function Calls (17)1.6.7If (18)1.6.8Case (18)1.6.9Send (19)1.6.10Receive (19)1.6.11Term Comparisons (21)1.6.12Arithmetic Expressions (22) 1.6.13Boolean Expressions (23)1.6.14Short-Circuit Boolean Expressions (23) 1.6.15List Operations (24)1.6.16Bit Syntax Expressions (24)1.6.17Fun Expressions (25)1.6.18Catch and Throw (26)1.6.19T ry (27)1.6.20Parenthesized Expressions (29)1.6.21Block Expressions (30)1.6.22List Comprehensions (30)1.6.23Bit String Comprehensions (31)1.6.24Guard Sequences (31)1.6.25Operator Precedence (32)1.7Macros (33)1.7.1De?ning and Using Macros (33)1.7.2Prede?ned Macros (34)1.7.3Flow Control in Macros (35)1.7.4Stringifying Macro Arguments (35)1.8Records (36)1.8.1De?ning Records (36)1.8.2Creating Records (36)1.8.3Accessing Record Fields (37)iv Erlang Reference Manual1.8.4Updating Records (37)1.8.5Records in Guards (37)1.8.6Records in Patterns (38)1.8.7Internal Representation of Records (38) 1.9Errors and Error Handling (38)1.9.1Terminology (38)1.9.2Exceptions (39)1.9.3Handling of Run-Time Errors in Erlang (40)1.9.4Exit Reasons (40)1.10Processes (41)1.10.1Processes (41)1.10.2Process Creation (41)1.10.3Registered Processes (41)1.10.4Process Termination (41)1.10.5Message Sending (42)1.10.6Links (42)1.10.7Error Handling (42)1.10.8Monitors (43)1.10.9Process Dictionary (43)1.11Distributed Erlang (43)1.11.1Distributed Erlang System (43)1.11.2Nodes (44)1.11.3Node Connections (44)1.11.4epmd (44)1.11.5Hidden Nodes (44)1.11.6C Nodes (45)1.11.7Security (45)1.11.8Distribution BIFs (45)1.11.9Distribution Command Line Flags (46) 1.11.10Distribution Modules (46)1.12Compilation and Code Loading (47) 1.12.1Compilation (47)1.12.2Code Loading (48)1.12.3Code Replacement (48)1.13Ports and Port Drivers (48)1.13.1Ports (49)1.13.2Port Drivers (49)1.13.3Port BIFs (49)vErlang Reference ManualList of Tables51 vi Erlang Reference ManualChapter1Erlang Reference Manual1.1Introduction1.1.1PurposeThis reference manual describes the Erlang programming language.The focus is on the language itself, not the implementation.The language constructs are described in text and with examples rather than formally speci?ed,with the intention to make the manual more readable.The manual is not intended as a tutorial.Information about this implementation of Erlang can be found,for example,in System Principles (starting and stopping,boot scripts,code loading,error logging,creating target systems),Ef?ciency Guide(memory consumption,system limits)and ERTS User’s Guide(crash dumps,drivers).1.1.2PrerequisitesIt is assumed that the reader has done some programming and is familiar with concepts such as data types and programming language syntax.1.1.3Document ConventionsIn the document,the following terminology is used:A sequence is one or more items.For example,a clause body consists of a sequence of expressions.This means that there must be at least one expression.A list is any number of items.For example,an argument list can consist of zero,one or morearguments.If a feature has been added recently,in Erlang5.0/OTP R7or later,this is mentioned in the text.1.1.4Complete List of BIFsFor a complete list of BIFs,their arguments and return values,refer to erlang(3).1Erlang Reference ManualChapter1:Erlang Reference ManualDecimal Class128-159Control characters160-191Punctuation characters192-214Uppercase letters215Punctuation character216-222Uppercase letters223-246Lowercase letters247Punctuation character248-255Lowercase lettersTable1.1:Character Classes.1.2Data Types1.2.1TermsErlang provides a number of data types which are listed in this chapter.A piece of data of any data type is called a term.1.2.2NumberThere are two types of numeric literals,integers and?oats.Besides the conventional notation,there are two Erlang-speci?c notations:$charASCII value of the character char.base#valueInteger with the base base,which must be an integer in therange2..36.In Erlang5.2/OTP R9B and earlier versions,the allowed range is2..16.Examples:2Erlang Reference Manual1.2:Data Types 422$A.1042#101.316 2.3.2300.008 2.3e-3.),or@.Examples:hellophone10,202"ABC".2:2More examples can be found in Programming Examples.1.2.5ReferenceA reference is a term which is unique in an Erlang runtime system,created by calling makeChapter1:Erlang Reference ManualFun erl3R ead more about funs in Fun Expressions[page25].More examples can be found in Programming Examples.1.2.7Port Identi?erA port identi?er identi?es an Erlang port.openlink/1,2,3,4and spawn0.51.0The BIF self()returns the pid of the calling process.Example: -module(m).-export([loop/0]).loop()-receivewho you-io:format("I am~p~n",[self()]),loop()end.1P=spawn(m,loop,[]).areI am0.58.0who youRead more about processes in Processes[page41].4Erlang Reference Manual1.2:Data Typesadam,24,july,292element(1,P).july,294P2=setelement(2,P,25).36size().Chapter1:Erlang Reference Manuala,2,c,4]2[H|T]=L1.a4T.[d,2,c,4]6length(L1).A collection of list processing functions can be found in the STDLIB module lists.1.2.11StringStrings are enclosed in double quotes(“),but is not a data type in Erlang.Instead a string"hello"is shorthand for the list[$h,$e,$l,$l,$o],that is[104,101,108,108,111].Two adjacent string literals are concatenated into one.This is done at compile-time and does not incur any runtime overhead.Example:"string""42"is equivalent to"string42"1.2.12RecordA record is a data structure for storing a?xed number of elements.It has named?elds and is similar to a struct in C.However,record is not a true data type.Instead record expressions are translated to tuple expressions during compilation.Therefore,record expressions are not understood by the shell unless special actions are taken.See shell(3)for details.Examples:-module(person).-export([new/2]).-record(person,name,age).new(Name,Age)-#person name=Name,age=Age.1person:new(ernie,44).1.2:Data Types.true2true or falseDescriptionbackspacedeleteescapeform feednewlinecarriage returnspacetabvertical tabcharacter with octal representation XYZ,YZ or Z control A to control Zsingle quotedouble quotebackslashtohello2list atom("hello").to"hello"4binary list(104,101,108,108,111).to104,101,108,108,1116float list(7.0).Chapter1:Erlang Reference Manualto7.000008integer list(77).to7710tuple list(a,b,c).toa,b,c12term binary(a,b,c).toa,b,c1.3Pattern Matching1.3.1Pattern MatchingVariables are bound to values through the pattern matching mechanism.Pattern matching occurs when evaluating a function call,case-receive-try-expressions and match operator(=)expressions.In a pattern matching,a left-hand side pattern[page15]is matched against a right-hand side term [page14].If the matching succeeds,any unbound variables in the pattern become bound.If the matching fails,a run-time error occurs.Examples:1X.2X+1.3**exception error:no match of right hand side value1,25X,Y=2,3.31.4Modules1.4.1Module SyntaxErlang code is divided into modules.A module consists of a sequence of attributes and function declarations,each terminatedby period(.).Example:8Erlang Reference Manual1.4:Moduleslib:chunks 2.There are several module attributes with prede?ned meanings,some of which have arity two,butuser-de?ned module attributes must have arity one.Pre-De?ned Module AttributesPre-de?ned module attributes should be placed before any function declaration.-module(Module).Module declaration,de?ning the name of the module.The name Module,an atom, should be the same as the?le name minus the extension erl.Otherwise code loading[page48] will not work as intended.This attribute should be speci?ed?rst and is the only attribute which is mandatory.-export(Functions).Exported functions.Speci?es which of the functions de?ned within the module that are visible outside the module.Functions is a list[Name1/Arity1,...,NameN/ArityN],where each NameI is an atom and ArityI an integer.-import(Module,Functions).Imported functions.Imported functions can be called the same way as local functions,that is without any module pre?x.Module,an atom,speci?es which module to import functions from.Functions is a list similar as for export above.-compile(Options).Compiler options.Options,which is a single option or a list of options,will be added to the option list when compiling the module.See compile(3).-vsn(Vsn).Module version.Vsn is any literal term and can beretrieved using beamlib(3)].If this attribute is not speci e d,the version defaults to the checksum of the module.9Erlang Reference ManualChapter1:Erlang Reference Manualserver,gen event or supervisor.The spelling behavior is also accepted.Read more about behaviours and callback modules in OTP Design Principles.Macro and Record De?nitionsThe same syntax as for module attributes is used for macro and record de?nitions:-define(Macro,Replacement).-record(Record,Fields).Macro and record de?nitions are allowed anywhere in a module,also among the function declarations. Read more in Macros[page33]and Records[page36].File InclusionThe same syntax as for module attributes is used for?le inclusion:-include(File).-includerecords.hrl").-include("incdir/myrecords.hrl").-include("$PROJ records.hrl").include1.5:Functionslib kernel include file.hrl .The code server uses code:libChapter1:Erlang Reference Manualclause run-time error will occur.If such a clause is found,the corresponding clause body is evaluated.That is,the expressions in the body are evaluated sequentially and the value of the last expression is returned.Example:Consider the function fact:-module(m).-export([fact/1]).fact(N)when N0-N*fact(N-1);fact(0)-1.Assume we want to calculate factorial for1:1m:fact(1).=(N is bound to1)1*fact(0)=1*112Erlang Reference Manual1.6:Expressionsclause run-time error will occur.1.5.3Tail recursionIf the last expression of a function body is a function call,a tail recursive call is done so that no system resources for example call stack are consumed.This means that an in?nite loop can be done if it uses tail recursive calls.Example:loop(N)-io:format("~w~n",[N]),loop(N+1).As a counter-example see the factorial example above that is not tail recursive since a multiplication is done on the result of the recursive call to fact(N-1).1.5.4Built-In Functions,BIFsBuilt-in functions,BIFs,are implemented in C code in the runtime system and do things that are dif?cult or impossible to implement in Erlang.Most of the built-in functions belong to the module erlang but there are also built-in functions belonging to a few other modules,for example lists and ets.The most commonly used BIFs belonging to erlang are auto-imported,they do not need to be pre?xed with the module name.Which BIFs are auto-imported is speci?ed in erlang(3).For example,standard type conversion BIFs like atom list and BIFs allowed in guards can be called without specifying the module name.Examples:1size(a,b,c).to"Erlang"Note that normally it is the set of auto-imported built-in functions that is referred to when talking about’BIFs’.1.6ExpressionsIn this chapter,all valid Erlang expressions are listed.When writing Erlang programs,it is also allowed to use macro-and record expressions.However,these expressions are expanded during compilation and are in that sense not true Erlang expressions.Macro-and record expressions are covered in separate chapters:Macros[page33]and Records[page36].13Erlang Reference Manual。

Erlang程序设计(第2版)读书笔记Erlang安装和基础语法电脑资料

Erlang程序设计(第2版)读书笔记Erlang安装和基础语法电脑资料

Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法 -电脑资料这篇文章主要介绍了Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法,需要的朋友可以参考下正如《代码的未来》中所说,为了充分利用多核,并发变成将成为未来发展的趋势,对于并发编程的支持,Erlang确实是不二之选,Erlang在国内仍然较为小众,经典书籍相对也要少很多,最终选择了《Erlang程序设计第2版》作为了我的第一本Erlang入门书籍,Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法。

Erlang :/Erlang安装:对于Ubuntu和Debian发行版可采用:apt-get install erlang 来安装;对于其他 UNIX 和 Linux 平台,可以下载源代码并手工构建它,具体如下所示:Download:/download.html代码如下:1. 解压源代码:$ tar zxf otp_src_17.3.tar.gz2. $ cd opt_src_17.33. $ ./configure4. $ make5. $ make installErlang是函数式编程语言,被设计主要用来解决自下而上的编写并发式、分布式、容错、可扩展和软实时系统等问题。

由于之前没有接触过函数式编程,还是从简单的顺序编程一步步来吧。

Erlang进入shell编程环境很简单,与Python类似,在终端直接输入erl即可,退出可使用 Ctrl+c 再输入 a 的方法,但这样可能导致某些数据的破坏,最好使用 q.注释:%变量:所有变量名都必须以大写字母开头,变量一经赋值,不许改变,模式匹配操作:Lhs = Rhs意思是计算右侧的值,然后将结果与左侧的模式相匹配;X = Expression,如果X之前没有被赋值,一定会匹配成功,X = AnotherExpression,则只有在Expression = AnotherExpression时才匹配成功,否则匹配失败;浮点数:使用“/”给两个整数做除法时,结果会自动转换为浮点数;要从除法里获得整数,必须使用div和rem;例如:5 div 3. 结果为1,5 rem 3. 结果为2;原子:原子被用于表示常量值,具有全局性,原子以小写字母开头,后接一串字母,数字,下划线或@符号;原子可以放在单引号中,可以创建以大写字母开头或包含字母数字以外字符的原子,如:‘Monday‘,‘+‘,‘a test paper‘等,原子的值就是它本身;元组:为了方便理解,元组最好加上标签,例如:{point, 10, 45}.创建元组:F = {firstName, joe}. L = {lastName, Tom}. P = {person, F, L}.提取firstName:{_, {_, Who}, {_, _}} = P.列表:列表中的各元素可以是任何类型,[H|T]中H为列表头,T为列表尾,例如:L = [{name, tom}, 1, 2.0, test, {point, 10, 23}].[H|T] = L.则,H = {name, tom}, T = [1, 2.0, test, {point, 10, 23}].字符串:字符串字面量就是用双引号围起来的一串字符,例如:N = "Hello". "Hello"其实只是一个列表的简写,这个列表包含了代表字符串里各个字符的整数字符代码,电脑资料《Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法》。

erlang中文基础教程

erlang中文基础教程

Erlang 编程(第一部分)1 顺序编程1.1 The Erlang Shell大多数操作系统都有一个命令行交互环境或者一个shell,对于UNIX和LINUX尤其是这样。

Windows也有自己的命令行模式。

Erlang也同样有自己的shell,我们可以直接在里面编写代码和运行我们编写的程序,并在其中看到我们的输出情况。

我们能够在多种操作系统上运行Erlang的shell,一般来说在我们所使用的操作系统的命令行中输入erl就可以了,我们将可能看到下面的提示:% erlErlang (BEAM) emulator version 5.2 [source] [hipe]Eshell V5.2 (abort with ^G)1>现在我们输入“2 + 5.”,(注意最后有一个英文句号,并不包括引号哈)1> 2 + 5.72>在Windows中,我们还可以通过双击Erlang shell的图标来启动Erlang shell。

你现在注意到了Erlang shell的命令行前面都有一个标号(例如1> 2>),并且下面正确的输出了我们的答案“7”!同样我们注意到我们的输入的最后有一个英文的句号,这是在我们最终按下回车之前的最后一个字符。

如果我们写在shell中的东西有什么错误,我们可以使用退格键进行删除,于是,我们推想我们可以使用其他shell下的一些常用的编辑命令,而事实上确实是这样的,以后我们使用到的时候再介绍。

现在我们尝试一下稍微复杂一点的运算:2> (42 + 77) * 66 / 3.2618.00我们现在使用了一些“复杂一点”的运算符号“*”和“/”,分别表示乘法运算和除法运算。

除此之外还支持其他一些运算符号,我们在以后使用到的时候再介绍。

我们打算关闭Elrang系统,则需要在Erlang shell中键入Ctrl+C,我们将看到下面的输出:BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded(v)ersion (k)ill (D)b-tables (d)istributiona%我们这时候键入“a”就会退出Erlang系统。

erlang教程

erlang教程

erlang教程
Erlang是一种并发编程语言,具有高度的可伸缩性和容错性。

本教程将带您逐步了解如何使用Erlang进行编程。

1. 安装和设置Erlang环境
- 下载Erlang编译器并进行安装
- 配置环境变量
2. Hello World
- 创建一个简单的Erlang程序来输出"Hello, World!"
3. 变量和数据类型
- 学习Erlang中的变量和数据类型,包括整数、浮点数、布尔值等。

4. 函数
- 定义和调用函数以及函数参数传递。

5. 条件语句
- 使用if和case语句进行条件判断和分支控制。

6. 循环
- 使用递归和列表推导来实现循环。

7. 并发编程
- Erlang的并发模型和并发编程概念。

8. 进程和消息传递
- 创建和管理进程以及在进程之间传递消息的方法。

9. 错误处理
- 如何在Erlang中处理异常和错误。

10. 文件操作
- 如何读写文件以及处理文件操作错误。

11. Erlang标准库
- Erlang提供的标准库函数和模块的使用。

请按照上述顺序逐步学习本教程中的每个主题。

每个主题都包含示例代码和解释,以帮助您更好地理解和掌握Erlang编程。

祝您学习愉快!。

erlang 语法

erlang 语法

erlang 语法Erlang语法介绍Erlang是一种函数式编程语言,最初由爱立信公司于1986年开发,用于构建可伸缩、分布式和容错的应用程序。

它以其并发处理和容错性能闻名,被广泛应用于电信领域。

1. 变量和数据类型在Erlang中,变量必须以大写字母开头,可以通过赋值来改变其值。

Erlang的数据类型包括数字、原子、字符串、元组、列表和字典等。

2. 函数定义和调用在Erlang中,函数定义使用关键字"fun"和"end",并使用模式匹配来执行不同的操作。

函数可以通过模块名和函数名来调用。

3. 条件语句和模式匹配Erlang中的条件语句使用"if"、"else"和"end"关键字。

模式匹配是Erlang中非常强大的特性,它可以根据不同的模式执行不同的操作。

4. 列表和列表操作Erlang中的列表是一种有序的元素集合,可以使用方括号来表示。

列表可以通过头部添加、尾部添加、查找、删除等操作来进行处理。

5. 递归和尾递归递归是Erlang中常用的编程技巧,可以用来处理重复的操作。

尾递归是一种特殊的递归形式,可以避免堆栈溢出的问题。

6. 模块和导出函数Erlang中的模块用于组织函数和数据,模块可以通过"module"关键字进行定义。

模块可以导出函数,使其可以被其他模块调用。

7. 进程和消息传递Erlang是一种基于进程的编程语言,进程是Erlang并发性的基本单元。

进程之间通过消息传递进行通信,可以通过发送和接收消息来实现进程间的交互。

8. 错误处理和异常Erlang提供了强大的错误处理和异常处理机制。

可以使用"try"、"catch"和"after"关键字来捕获和处理异常,使程序具备容错性。

9. 并发和并行Erlang在语言层面提供了原生的并发支持,可以轻松地创建和管理大量的并发进程。

相关主题
  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函数的两个部分都调用了它的句话。

相关文档
最新文档