2.笔记Erlang语言——基本操作
来源:互联网 发布:charles mac 破解版 编辑:程序博客网 时间:2024/06/03 13:49
2.笔记Erlang语言——基本操作
整数运算
Erlang遵守标准算术表达式法则,因此20+30*40实际上是20+(30*40)而不是(20+30)*40 Erlang采用不定长的整数来进行整数的算术演算,因此不用担心溢出
还可以用不同的方式来输入整数.
2> 20 + 30 * 40.
1220
3> 23495499596969767997 * 999239423942394929349293942394* 92349234923429342349.
2168141120525994116515900593963409064224981879290022872191364794677482
变量
如下:
12> X = 123.
123
13> X.
123
14> X * X * X.
1860867
如果你想要给X赋一个新的值,那么系统会无情的抛给你一个错误信息
1)X并不是传统意义上的变量;
2)=不是一个赋值操作符。
Erlang的变量是单一赋值变量,即变量的值只能一次性的给定。一个变量如果含有一个被赋予的值,那么它就被称为绑定变量,否则就是自由变量。就本质而言,=是一个模式匹配符,当变量是一个自由变量时,它的行为与赋值一致。最后,定义一个变量的词法单元就是这个变量的作用域。因此在一个函数语句中使用的变量,那么这个变量的值就不能跳出语句之外。在同一个函数的不同子句中,彼此也不存在全局或者共享的私有变量。如果X出现在许多不同函数中,那么这些X的值也都是各自独立的。
在大多数语言中,=都表赋值语句;但是在Erlang中,=表示一个模式匹配操作。
Lhs=Rhs实际上是这样一个过程,对右端求值(Rhs),然后将结果与左端(Lhs)进行模式匹配。一个变量,比如X,就是一个最简单的模式,当我们第一次输入X=something时,Erlang会问自己,“要怎么做会让这个语句的值变为true?”,由于X没有被赋值,于是将something的结果绑定到X上,使语句有效,结果皆大欢喜。但是,随后输入X=anotherthing的时候,由于X已经是绑定变量了,只有当something的值与anotherthing一致时这个语句才会成立,否则就会抛出异常。
Erlang里面的变量仅仅是对值的一个引用,就具体实现而言,一个绑定变量就是一个指针,这个指针指向那个值的存储区。那个值是无法改变的。
用术语来说,我们把可以修改的内存区域称为可变状态。Erlang是一个函数式语言,不存在可变状态。当多核编程来临的时候,我们会发现采用不可变状态带来的好处是难以估量的。像C或者JAVA这样的传统语言在为多核CPU编程时,遇到内存共享的问题,要想不破坏内存共享就必须在访问时加锁,还要保证在操纵共享内存时程序不会崩溃。而Erlang没有可变状态,也没有共享内存,更没有锁,这些都有利于并行化程序的编写。
浮点数
1> 5/3.
1.6666666666666667
2> 5 div 3.
1
3> 5 rem 3.
2
4> 4 div 2.
2
第一行最后是整数“3”,那个点表示结束表达式,而不是小数点,如果要表示一个浮点数应该写成“3.0”
“/”永远返回浮点数,所以第2个表达式中的“4/2”结果不是2,而是2.0。
div和rem表示整数除和取余数。
原子
在Erlang中,原子用来表示不同的非数字常量值。
类似于C中的:#define OP_READ 1 这种宏定义。
Erlang中的原子是全局有效的,而且无需使用宏定义或者包含文件。
原子是一串以小写字母开头,后跟数字、字母或者下划线(_)或者邮件符号(@)的字符,例如monday、abc_d、aaa@somehost等。使用单引号引起来的字符也是原子,使用这种形式,我们就能使得原子可以用大写字母作为开头或者包含非数字字符, 例如‘+’、‘a b c’等。
一个原子的值就是原子自身。讨论原子或者整数的值听上去多少有些奇怪,但是因为Erlang是个函数式语言,每一个表达式都必须有值,整数和原子这些特别简单的表达式也不例外。
元组
若想将一定数量的项组成单一的实体,那么就可以使用元组(tuple)。将若干个以逗号分隔的值,用一对花括号括起来,就形成了一个元组。例如一个叫joe的人身高1米8,那么用元组就可以表示为 { joe, 180 }。元组类似于C中的结构.
元组可以嵌套,例如下面的例子:
5> Person ={person,{name,joe},{height,1.82},{footsize,42},{eyecolour,brown}}.
{person,{name,joe},
{height,1.82},
{footsize,42},
{eyecolour,brown}}
创建元组
在声明元组时就自动创建了元组,不再使用它们时,元组也随之销毁,Erlang使用垃圾收集器去收回没有使用的内存,因此我们不用担心内存分配的问题。
如果你创建的元组引用了一个已经绑定的变量,那么新元组就会享有这个变量所引用的数据结构。例如:
7> P = {Person,lastName}.
{{person,{name,joe},
{height,1.82},
{footsize,42},
{eyecolour,brown}},
lastName}
而若在创建数据结构时试图引用一个未定义的变量,那么系统就会给出一个错误。
从元组提取字段值
8> Point = {point,10,45}.
{point,10,45}
提取如下:
退8> Point = {point,10,45}.
{point,10,45}
9> {point,X,Y} = Point.
{point,10,45}
10> X.
10
11> Y.
45
符号_称为匿名变量,与常规变量不同,在同一个模式中的不同地方,各个 _ 所绑定的值不必相同。
列表
用列表存储数目可变的东西,如在商场购买的商品、行星的名字、公交的站点等等。
将若干以逗号分隔的值,用一对方括号括起来,就形成了一个列表。
下面的例子就是一个购物清单的列表:
19> ThingsToBuy =[{apples,10},{pears,6},{milk,3}].
[{apples,10},{pears,6},{milk,3}]
列表的第一个元素称为列表的头(head),那么剩下的,就称为列表的尾(tail)。
列表的头可以是任何东西,但是列表的尾还是一个列表。
访问列表的头是一个非常高效的操作,因此,实际上所有的列表处理函数都是从提取列表的头开始的,先对头进行处理,然后再继续处理列表的尾。
如果T是一个列表,那么 [ H | T ] 也是一个列表,这个列表以H为头,以T为尾。
竖线|符号可以将列表的头和尾分隔开,而 [ ] 则是表示空列表。
无论何时,我们用 [ … | T ] 来构建一个列表时,都应保证T是一个列表,如果T是一个列表,那么新的列表就是“正规形式”,反之就是“非正规列表”。大多数函数库都假定列表时正规的,它们不能正确处理非正规列表。
可以用 [ E1, E2, …, En | T ] 这种形式向T的起始处加入多个新元素
21> ThingsToBy1 =[{oranges,4},{newspaper,1}|ThingsToBuy].
[{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,3}]
23> [Buy1|ThingsToBuy2] = ThingsToBy1.
[{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,3}]
那么这个Buy1的值就是 { oranges, 4 } ,ThingsToBuy2的值就是后面元素组成的列表。
字符串
严格来讲,Erlang没有字符串,字符串实际上就是一个整数列表。
用双引号将一串字符括起来,就形成了一个字符串。例如:
24> Name = "Hello".
"Hello"
注意,Erlang中只能使用双引号表示字符串,而不能使用单引号。
这里的 ”Hello”仅仅是一个速记形式,实际上它意味着一个整数列表,列表中每一个元素都是相应字符的整数值。
当列表中的所有整数都是可打印的字符,它才将这个列表当做字符串来打印,例如:
27> [83,84].
"ST"
无需死记硬背哪个整数表示哪个字符,可以使用$符号来表示字符的整数,例如$a就是一个整数,表示字符a
28> I=$s.
115
- 2.笔记Erlang语言——基本操作
- 1.笔记Erlang语言——入门
- R语言学习笔记——RMySQL基本操作
- Erlang File基本操作
- erlang 语言学习笔记
- Erlang笔记(04) - 基本Erlang数据类型
- R语言学习笔记——R语言数据处理基本操作
- Erlang中的基本元素操作
- SDK基本的语句与操作——《c语言也能干大事》笔记
- SQL语言笔记——基本命令
- c语言笔记——基本数据类型
- MySQL学习笔记——基本操作
- MySQL学习笔记—基本操作汇总
- MySQL学习笔记—基本操作汇总
- (Erlang语言)Erlang运行时中的原子操作
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- Erlang学习记录(二)——基本数据类型
- 单元测试方法的使用
- There is insufficient memory for the Java Runtime Environment to continue
- mysql 5.3.9 for mac 忘记密码
- gradle项目发布到自定义的tomcate中
- ubuntu16.04_tensorflow_gpu加速_源码安装笔记
- 2.笔记Erlang语言——基本操作
- C语言指针详细解答
- TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅
- 一个简洁易用的 Android Web 库
- Linux常用命令(二)-权限管理
- TextView内部类Layout光标相关方法
- 《图解HTTP精华解读》笔记
- 方法的重写
- 矩阵取数问题