学习Erlang--1、入门

1、正式起航

从前,一名程序员偶然读到了一本古怪的语言图书,相等其实不是相等,变量其实是不能改变的,语法是那么陌生,它甚至不是面向对象,这些程序实在是太过另类……

另类的不仅仅是程序,编程的教学步骤也特立独行,它的作者一直喋喋不休地教授并发、分布和容错,不断的唠叨着一种叫COP(Concurrency Oriented Programming,面向并发编程)的方法,管它叫什么……

不过有些程序看起来很好玩,那天夜里,这个程序员注视着那个聊天程序的小例子,它是多么的小巧可爱而又通俗易懂,它确实简单到不能再简单了,用不了几行代码,文件共享和加密通信便跃然而上,于是这个程序员开始敲起了他的键盘……

上面这段话非常简单有趣,而又把Erlang的特点很好的带了出来,使我和那个提到的程序员一样,开始了我的Erlang之旅。

2、Erlang安装

在Erlang的官方网站http://www.erlang.org/ 可以找到它的安装程序,

由于我的是windows系统,所以我直接进入Download页面,找到Windows Binary File下载就行了。

等下载好之后的安装也非常简单,直接next就行,完成后就可以在开始菜单找到

 这么一个东东,打开后就能看到

这个就是我们得Erlang的一个模拟器了,当然,使用windows的cmd或者unix下的bash在命令提示符下输入erl来启动Erlang shell--erl也是一样的。

我们尝试一下,如下图输入

提示符 1> 说明这是我们的第一个命令,% 号后面跟着的是注释文字,它表示此行都是Erlang的注释,会被shell和Erlang编译器忽略。

第二行输入20+30,然后回车,没有出结果?因为在Erlang中是以 “. + 回车”来表示一个完整命令的结束的,

所以第三行还是提示的1>,表示我们的第一个命令还是没结束,然后我们输入 “.”和回车,这时候shell会对表达式求值,并打印出结果,50.

然后显示的提示符就编程2>,表示我们下面开始的就是第2个Erlang命令了。

另外,之前录入的命令我们可以通过shell的Ctrl+N,Ctrl+P快捷键来找回。

如果程序命令输入有误,已经到了不可挽回的地步,系统没有任何响应,那么按Ctrl + break(windows系统)你会看到下面的提示:

这个时候按A就能中止当前Erlang会话

3、入门

3.1、简单的整数运算

先计算几个算数表达式

Erlang遵守标准算术表达式法则,因此20+30*40实际上是20+(30*40)而不是(20+30)*40

Erlang采用不定长的整数来进行整数的算术演算,因此不用担心溢出,例如:

还可以用不同的方式来输入整数,例如:

3.2、变量

怎样才能将一个命令的结果保存下来以供后面使用呢?这就是变量了,例如:

上面例子表示我们向一个变量X赋了一个值,然后打印出变量的值

如果我们要查看变量的值,可以输入

有了X变量,我们还可以这么使用

代数式的单一赋值

在初中,数学老师告诉我们,在同一个方程的不同地方都有X,那么这些X指的都是同一个东西;

但是当我们开始学习第一门程序语言时,看到X=X+1,我们都懵了,这个等式明显不成立!但是老师却说我们错了,X不是一个数学变量,而是一个盒子……

而在Erlang中,变量恢复了它在数学中的涵义,当你将一个变量和值关联在一起时,你就相当于做出了一种断言,就是对事实的一个陈述,仅此而已。

然而,如果你想要给X赋一个新的值,那么系统会无情的抛给你一个错误信息:

这个是怎么回事?嗯,要解释它我们必须破除两个错误的想法:

1)X并不是传统意义上的变量,至少不是我们在C/C++/C#中用到的那种;

2)=不是一个赋值操作符。

3.2.1、变量不变

Erlang的变量是单一赋值变量,即变量的值只能一次性的给定。

一个变量如果含有一个被赋予的值,那么它就被称为绑定变量,否则就是自由变量。

就本质而言,=是一个模式匹配符,当变量是一个自由变量时,它的行为与赋值一致。

最后,定义一个变量的词法单元就是这个变量的作用域。因此在一个函数语句中使用的变量,那么这个变量的值就不能跳出语句之外。

在同一个函数的不同子句中,彼此也不存在全局或者共享的私有变量。如果X出现在许多不同函数中,那么这些X的值也都是各自独立的。

3.2.2、模式匹配

在大多数语言中,=都表赋值语句;但是在Erlang中,=表示一个模式匹配操作。

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

一个变量,比如X,就是一个最简单的模式,当我们第一次输入X=something时,Erlang会问自己,“要怎么做会让这个语句的值变为true?”,由于X没有被赋值,于是将something的结果绑定到X上,使语句有效,结果皆大欢喜。

但是,随后输入X=anotherthing的时候,由于X已经是绑定变量了,只有当something的值与anotherthing一致时这个语句才会成立,否则就会抛出异常。例如:

3.2.3、单一赋值为何有益于编写质量更高的代码

Erlang里面的变量仅仅是对值的一个引用,就具体实现而言,一个绑定变量就是一个指针,这个指针指向那个值的存储区。那个值是无法改变的。

抛弃“副作用”意味着我们的程序可以并行化

用术语来说,我们把可以修改的内存区域称为可变状态。Erlang是一个函数式语言,不存在可变状态。

当多核编程来临的时候,我们会发现采用不可变状态带来的好处是难以估量的。

像C或者JAVA这样的传统语言在为多核CPU编程时,遇到内存共享的问题,要想不破坏内存共享就必须在访问时加锁,还要保证在操纵共享内存时程序不会崩溃。而Erlang没有可变状态,也没有共享内存,更没有锁,这些都有利于并行化程序的编写。

那么你又会问,没有变量那怎么去描述X=X+1这种表达式呢?答案很简单,采用一个新的变量,例如X1,使X1=X+1

(好吧。。。其实我看到这里的时候喷了一显示器。。。)

3.3、浮点数

让我们用浮点数做一些运算:

注意,第一行最后是整数“3”,那个点表示结束表达式,而不是小数点,如果要表示一个浮点数应该写成“3.0”

“/”永远返回浮点数,所以第2个表达式中的“4/2”结果不是2,而是2.0。

div和rem表示整数除和取余数。

3.4、原子

在Erlang中,原子用来表示不同的非数字常量值。

类似于C中的:#define OP_READ 1 这种宏定义。

Erlang中的原子是全局有效的,而且无需使用宏定义或者包含文件。

原子是一串以小写字母开头,后跟数字、字母或者下划线(_)或者邮件符号(@)的字符,

例如monday、abc_d、[email protected]等。

使用单引号引起来的字符也是原子,使用这种形式,我们就能使得原子可以用大写字母作为开头或者包含非数字字符,

例如‘+’、‘a b c’等。

一个原子的值就是原子自身。

讨论原子或者整数的值听上去多少有些奇怪,但是因为Erlang是个函数式语言,每一个表达式都必须有值,整数和原子这些特别简单的表达式也不例外。

3.5、元组

你若想将一定数量的项组成单一的实体,那么就可以使用元组(tuple)。

将若干个以逗号分隔的值,用一对花括号括起来,就形成了一个元组。

例如一个叫joe的人身高1米8,那么用元组就可以表示为 { joe, 180 }。

元组类似于C中的结构,C语言中要定义point类型的变量p,要这么做:

并通过点来访问一个结构的字段,例如:

但是在Erlang中没有类型声明,因此创建一个point会是这个样子:

这个语句创建了一个元组,并将其绑定给了变量P。

和C不同的是元组没有字段名称,为了方便记忆可以给元组添加一个原子作为其第一个元素,来标记这个元组的含义,

因此我们可以采用 { point, 10, 45 } 来代替上面的元组,这样更清晰。

元组可以嵌套,例如下面的例子:

3.5.1、创建元组

在声明元组时就自动创建了元组,不再使用它们时,元组也随之销毁,Erlang使用垃圾收集器去收回没有使用的内存,因此我们不用担心内存分配的问题。

如果你创建的元组引用了一个已经绑定的变量,那么新元组就会享有这个变量所引用的数据结构。例如:

而若在创建数据结构时试图引用一个未定义的变量,那么系统就会给出一个错误。

3.5.2、从元组中提取字段值

此处就要用到我们之前提到的模式匹配符= 了。

回到之前元组表示点的例子:

若想提出点的坐标值怎么做呢?如下所示:

作为演示,我们使用一个复杂的元组:

下面我们要获取他的姓,按如下写法

最后打印出who

符号_称为匿名变量,与常规变量不同,在同一个模式中的不同地方,各个 _ 所绑定的值不必相同。

3.6、列表

我们用列表存储数目可变的东西,如在商场购买的商品、行星的名字、公交的站点等等。

将若干以逗号分隔的值,用一对方括号括起来,就形成了一个列表。

下面的例子就是一个购物清单的列表:

列表中的各个元素可以有不同的类型,例如

3.6.1、术语

列表的第一个元素称为列表的头(head),那么剩下的,就称为列表的尾(tail)。

列表的头可以是任何东西,但是列表的尾还是一个列表。

访问列表的头是一个非常高效的操作,因此,实际上所有的列表处理函数都是从提取列表的头开始的,先对头进行处理,然后再继续处理列表的尾。

3.6.2、定义列表

如果T是一个列表,那么 [ H | T ] 也是一个列表,这个列表以H为头,以T为尾。

竖线|符号可以将列表的头和尾分隔开,而 [ ] 则是表示空列表。

无论何时,我们用 [ … | T ] 来构建一个列表时,都应保证T是一个列表,如果T是一个列表,那么新的列表就是“正规形式”,反之就是“非正规列表”。大多数函数库都假定列表时正规的,它们不能正确处理非正规列表。

可以用 [ E1, E2, …, En | T ] 这种形式向T的起始处加入多个新元素,例如

3.6.3、从列表中提取元素

我们可以用模式匹配操作从一个列表中获取元素,假定现在有一个非空列表L,那么表达式 【X | Y】=L (X,Y都是变量)可以把列表头提取到X,可以把列表尾提取到Y。

如果我们有个超市购物的列表清单,首先要做的就是把列表分解成头和尾:

那么这个Buy1的值就是 { oranges, 4 } ,ThingsToBuy2的值就是后面元素组成的列表。

3.7、字符串

严格来讲,Erlang没有字符串,字符串实际上就是一个整数列表。

用双引号将一串字符括起来,就形成了一个字符串。例如:

注意,Erlang中只能使用双引号表示字符串,而不能使用单引号。

这里的 ”Hello”仅仅是一个速记形式,实际上它意味着一个整数列表,列表中每一个元素都是相应字符的整数值。

shell打印一串列表值时,只有当列表中的所有整数都是可打印的字符,它才将这个列表当做字符串来打印,例如:

我们无需死记硬背哪个整数表示哪个字符,可以使用$符号来表示字符的整数,例如$a就是一个整数,表示字符a,再有:

字符串中使用的字符集

字符串中的字符是Latin-1(ISO-8859-1),例如一个含有瑞典名字的字符串会被编码成为

如果在shell中将作为表达式输入,你可能看不到想要的结果,这实际上是显示终端的字符集和区域设定的问题,Erlang对于这类问题束手无策。

3.8、再论模式匹配

逐行研究下表的例子,确保真正掌握了这些

可以在shell中输入 模式=值 来查看运行结果

命令f()会让shell释放它所绑定过的所有变量,使用这个命令后,所有的变量都变成了自由变量

现在我们对基本的数据类型已经非常熟悉了,对单一赋值和模式匹配也有了了解,因此我们可以加快步伐进入下一章,学习如何定义函数和模块。

from : http://www.cnblogs.com/tonywang711/archive/2012/10/19/2731395.html

时间: 2024-10-30 02:23:57

学习Erlang--1、入门的相关文章

RPC学习----Thrift快速入门和Java简单示例

一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加容易. 二.什么是Thrift? thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和

Struts学习傻瓜式入门篇

或许有人觉得struts不容易学,似乎里面的一些概念让未接触过的人迷惑,MVC1.MVC2.模式……我写这篇文章是想让从来没有接触过struts的人,能有个简单的入门指引,当然,系统地学习struts是必要的,里面有很多让人心醉的东东,那是后话了. 该案例包括首页,用户登陆.网站向导页面.就这么简单,没有深奥的struts概念,主要靠动手,然后用心体会. WEB Server用tomcat4.到http://jakarta.apache.org下载struts1.1,把zip文 件释放到c:\s

现代C++学习笔记之一入门篇:智能指针(C++ 11)

原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 在现代 C++ 编程中,标准库包含智能指针,该指针用于确保程序不存在内存和资源泄漏且是异常安全的. 在现代 C++ 中,原始指针仅用于范围有限的小代码块.循环或者性能至关重要且不会混淆所有权的 Helper 函数中. 1 void UseRawPointer() 2 { 3 // Using a raw pointer -- not recommended

erlang分布式入门(一)-ping pong

erlang分布式入门(一)-ping pong 测试环境和http://willvvv.iteye.com/blog/1523918 一样,192.168.0.182(centos-182)和192.168.0.183(centos-183), 1.按照上面链接(步骤1-4)设置通过ssh hostname 免输入密码直接登录. 2.设置erlang的magiccookie,由于都是以root账号操作,分别在两台机子上执行以下命令 cd /root vi .erlang.cookie 输入 S

Erlang cowboy 入门参考

Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/getting_started/ 我没有按原文逐句翻译.仅仅是我自己的理解,力求简单明了.本文程序在RHEL6.4上写成并运行,参考下面的文章,安装Erlang: erlang在redhat上的安装 1 引言 Erlang不仅仅是一门语言,更是一个操作平台.Erlang开发者很少写单独的模块,而是写库和程序,然

刚刚学习完了Java入门,不知下一步

刚刚学习完了Java入门,学习了进阶,下一步不知道该往哪个方面继续学习了! 当初自学Java的时候就想着有一天可以编制出自己的软件,最好是可以引领生活,世界进步的(话有点大,没关系,还没有实现,谁知道呢)!刚才上网又自己查了一下,不知道<Java思想>怎么样,能不能看懂,是不是都是英文的??? 大神求助啊:迷茫中...

学习Android开发入门

学习Android开发入门第四章:类与对象(上)-掌握成员变量和局部变量的使用-掌握方法重载和重写-掌握构造方法的执行过程-掌握static关键字的使用-掌握多态 本章 链接:1)http://pan.baidu.com/s/1gdmm3Nt2)http://pan.baidu.com/s/1kTn0sCZ<5>第五章:类与对象(下)- 掌握包的概念及包语句- 掌握掌握各种访问权限- 掌握final和abstract关键字- 掌握接口的定义及使用- 使用Eclispe创建jar包 本章 链接:

3、Kafka学习分享|快速入门-V3.0

Kafka学习分享|快速入门 这个教程假定你刚开始是新鲜的,没有现存的Kafka或者Zookeeper 数据.由于Kafka控制控制脚本在Unix和Windows平台不同,在Windows平台使用bin\windows\ 代替 bin/,并且更改脚本扩展名为.bat. 第一步:下载编码 下载0.10.2.0版本并且解压它. 第二步:启动服务器 Kafka使用Zookeeper,因此如果你没有Zookeeper server,你需要先启动a ZooKeeper server.你可以使用Kafka的

springmvc学习笔记(5)-入门程序小结

springmvc学习笔记(5)-入门程序小结 springmvc学习笔记5-入门程序小结 入门程序配置小结 非注解的完整的配置文件 注解的完整配置文件 通过入门程序理解springmvc前端控制器.处理器映射器.处理器适配器.视图解析器用法.并附上入门程序的非注解的完整的配置文件,注解的完整配置文件. 入门程序配置小结 前端控制器配置: 第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析 第二种:/,所以访问的地址都由DispatcherServl

Unity3d_学习笔记_入门

转自:http://blog.csdn.net/zlfxy/article/details/8722437 本文内容来自“编程教父”的视频课程. 1.Unity3d一个游戏引擎,可以用来开发很多游戏. 要利用Unity3d开发游戏,我们首先要下载一个Unity3d软件.下载后,下载一个破解补丁,这样就可以正常进行开发了. 2.Unity3d每次只能开启一个工程项目. (1)Unity3d中比较重要的一个对象就是摄像机了,摄像机就相当于我们人的眼睛,有了摄像机,运行程序后,才能够有视野. (2)U