Erlang的基本概念

一. 简单的整数运算

  • Erlang遵循算术表达式的一般规则

    1. Erlang可以用任意长度的整数执行整数运算。在Erlang里,整数运算是精确的,因此无需担 心运算溢出或无法用特定字长(word size)来表示某个整数。

    2. 可以用多种方式输入整数:

      在elang中使用“#”就可以进行进制的转换,不过使用这个进行进制转换的话,只能从2~36进制之间的整数转换成10进制的数据。 使用“#”转换的格式是:base#value。 其中base的取值是2~36之间,value的取值是base进制下的相应数据。看一些例子吧: 60> 2#101. 5 61> 16#cafe. 51966 62> 36#fanyingfei. 1553487963263226

二. 变量

  • Erlang的变量是一次性赋值变量(single-assignment variable)。顾名思义,它们只能被赋值一 次。如果试图在变量被设置后改变它的值,就会得到一个错误(事实上,你将得到的是我们刚 才看到的“badmatch”,即不匹配错误)。已被指派一个值的变量称为绑定变量,否则称为未绑定 变量。

个人观点:感觉就像是java中的final。

  • 变量的作用域是它定义时所处的语汇单元。因此,如果X被用在一条单独的函数子句之内,它的值就不会“逃出”这个子句。没有同一函数的不同子句共享全局或私有变量这种说法。 如果X出现在许多不同的函数里,那么所有这些X的值都是不相干的。

  • 在Erlang里,变量获得值是一次成功模式匹配操作的结果。

    在大多数语言里,=表示一个赋值语句。而在Erlang里,=是一次模式匹配操作。

    举个例子:

  • 你可能会觉得我在这一点上过于啰嗦了。现在这个阶段,=左边的所有模式都仅仅是绑定或 未绑定的变量,但在后面将会看到,我们可以制作任意复杂的模式来用=操作符进行匹配。我会 在介绍元组和列表(它们被用于保存复合数据项)之后再回到这个主题上。

  • 没有副作用,意味着可以让程序并行

    如果使用C或Java这些传统编程语言来为多核CPU编程,就不得不对付共享内存的问题。 为了不破坏共享内存,访问时必须给这些内存加锁。访问共享内存的程序在操作共享内存时万 万不可崩溃。

    Erlang里没有可变状态,没有共享内存,也没有锁。这让程序并行变得简单了。

  • 程序出错的一个常见发现方式是我们看到某个变量有着意料之外的值。

  • 此时此刻,你可能想知道:没有可变变量将如何编程?在Erlang里怎样表达X = X + 1这类 概念?Erlang的方式是创建一个名字未被使用过的新变量(比方说X1),然后编写X1 = X + 1。

三. 浮点数

  1. 由于句号是结束符号,如果我们想写浮点数3, 就要写成3.0

  2. 当你用两个整数做除法时,结果会自动转换成浮点数。

  3. 5 div 3. 表示让5除以3然后舍去余数

  4. 5 rem 3. 表示让5除以3后得到剩余的余数

  5. Erlang在内部使用64位的IEEE 754-1985浮点数,因此使用浮点数的程序会存在和C等语言一 样的浮点数取整与精度问题。

四. 原子

  1. 原子被用于表示常量值

  1. 用符号常量来让程序能自我描述

    举例:

  1. 在Erlang里,原子是全局性的,而且不需要宏定义或包含文件就能实现

  2. 规则1:原子以小写字母开头,后接一串字母、数字、下划线(_)或a(t @)符号,例如red、december、 cat、meters、yards、joe@somehost和a_long_name。

  3. 规则2: 原子还可以放在单引号(')内。可以用这种引号形式创建以大写字母开头(否则会被解释

    成变量)或包含字母数字以外字符的原子,例如'Monday'、'Tuesday'、'+'、'*'和'an atom with spaces'。

可以给无需引号的原子加上引号,因此'a'和a的意思完全一致

  1. 双引号用 于给字符串字面量(string literal)定界

五. 元组

1. 创建元组

  • 定义:如果想把一些数量固定的项目归组成单一的实体,就会使用元组(tuple)

  • 创建方法:用大括号把想要表示的值括起来,并用逗号分隔它们。

  • 元组类相当于java中的类,c语言中的结构体

举例:表示一个坐标

c语言:

struct point{int x;int y;
} P;
​
P.x = 10;
P.y = 45;

Erlang:

注意:erlang没有声明*

P = {10, 45}  % 这样就创建了一个元组并把它绑定到变量P上

与C结构不同,元组里的字段没有名字。因 为这个元组只包含一对整数,所以必须记住它的用途是什么。为了更容易记住元组的用途,一种 常用的做法是将原子作为元组的第一个元素,用它来表示元组是什么。因此,我们会写成{point, 10, 45}而不是{10, 45},这就使程序的可理解性大大增加了。这种给元组贴标签的方式不是语 言所要求的,而是一种推荐的编程风格。

  • 元组可以嵌套

举例:假如想要表示某人的一些情况(名字、身高、鞋码和眼睛颜色),就可以 像下面这么写:

% 请注意我们是如何将原子同时用于标明字段和(在name和eyecolour里)作为字段值的。
Person = {person, {name, joe}, {height, 1.82}, {footsize, 42}, {eyecolour, brown}}
  • 垃圾收集

    • 元组会在声明它们时自动创建,不再使用时则被销毁。

    • Erlang使用一个垃圾收集器来回收所有未使用的内存,这样就不必担心内存分配的问题了

    • 如果在构建新元组时用到变量,那么新的元组会共享该变量所引用数据结构的值

      举例:

    • 如果试图用未定义的变量创建数据结构,就会得到一个错误

2. 提取元组的值

  • 虽然=看上去像是赋值语句,但其实不是,它是一个模式匹配操作符。模式匹配是erlang的根基,在众多不同的任务中都会用到。

    它被用于从数据结构里提取值,控制函数内部的流程,在并行程序里给进程发消息时,还会用它 选择该处理哪些消息。

  • 如果想从某个元组里提取一些值,就会使用模式匹配操作符=。

    举例:

  • 如果是一个复杂的元组,就可以编写一个与该元组形状(结构)相同的模式,并在待提取值 的位置加入未绑定变量来提取该元组的值。

    举例:

    Person={person, {name, joe, armstrong}, {footsize, 42}}.
    % 现在将编写一个模式来提取此人姓名中的名(first name)
    {_,{_,Who,_},_} = Person.
    Who.

请注意,我们在前面这个例子中将作为占位符,用于表示不感兴趣的那些变量。符号被 称为匿名变量。与正规变量不同,同一模式里的多个_不必绑定相同的值。

六. 列表

1. 定义:

列表(list)被用来存放任意数量的事物。创建列表的方法是用中括号把列表元素括起来, 并用逗号分隔它们。

% 列表里的各元素可以是任何类型
[1+7, hello, 2-2, {cost, apple, 30-20}, 3].

2. 专用术语

列表的第一个元素被称为列表头(head)。假设把列表头去掉,剩下的就被称为列表尾(tail)。

举例:

列表头是整数5, 列表尾则是[4,3,2,1]。请注意,列表头可以是任何事物,但列表尾通常仍然是个列表。

访问列表头是一种非常高效的操作,因此基本上所有的列表处理函数都从提取列表头开始,然后对它做一些操作,接着处理列表尾。

3. 定义列表

如果T是一个列表,那么[H|T]也是一个列表,它的头是H,尾是T。竖线(|)把列表的头与 尾分隔开。[]是一个空列表。

无论何时,只要用[...|T]语法构建一个列表,就应该确保T是列表。如果它是,那么新列 3 表就是“格式正确的”。如果T不是列表,那么新列表就被称为“不正确的列表”。大多数库函数假定列表有正确的形式,无法用于不正确的列表。

可以给T的开头添加不止一个元素,写法是[E1,E2,..,En|T]。

举例:

% 如果一开始定义ThingsToBuy, 注意,等号左右不能加空格
ThingsToBuy = [{apple, 10},{pear, 6},{milk, 3}].
% 那么就可以这样扩展列表
ThingsToBuy1 = [{oranges, 4}, {newspaper, 1} | ThingsToBuy].

4. 提取列表元素

  • 可以用模式匹配操作来提取某个列表里的元素,如果有一个非空列表 L,那么表达式[X|Y] = L(X和Y都是未绑定变量)会提取列表头作为X,列表尾作为Y

    举例:当我们在商店里,手上拿着购物单ThingsToBuy1时,所做的第一件事就是把这个列表拆成 头和尾。

    [Buy1 | ThingsToBuy2] = ThingsToBuy1. % [{oranges,4},{newspaper,1},{apple,10},{pear,6},{milk,3}]
    ​
    % 操 作 成 功 , 绑 定 如 下 : Buy1 = {oranges,4} , ThingsToBuy2 = [{newspaper,1}, {apples,10}, {pears,6}, {milk,3}]。于是我们先去买橙子(oranges),然后可以继续拆出 下一对商品。
    ​
    [Buy2, Buy3 | ThingsToBuy3] = ThingsToBuy2. % [{newspaper,1},{apple,10},{pear,6},{milk,3}]
    ​

七. 字符串

Erlang里没有字符串

  • 可以用字符串字面量来创建这样一个列表。字符串字面量(string literal)其实就是用双引号 (")围起来的一串字符

    举例

    Name = "hello" % 在Erlang里,必须使用双引号
  • $a实际上就是代表字符a的整数(unicode码),以此类推

  • 用列表来表示字符串时,它里面的各个整数都代表Unicode字符。必须使用特殊的语法才能输 入某些字符,在打印列表时也要选择正确的格式惯例。通过下面这个例子可以更好地理解这一点。

    % 我们创建了一个包含三个整数的列表。第一个整数97是字符a的ASCII和Unicode 编码。\x{221e}这种记法的作用是输入一个代表Unicode无穷大字符的十六进制整数(8734)。 最后,98是字符b的ASCII和Unicode编码。shell用列表记法([97,8734,98])将它打印出来,这 是因为8734不是一个可打印的Latin1字符编码。
    X = "a\x{221e}b".
    ​
    % 我们用一个格式化I/O语句打印出这个字符串,里面使用了代表无穷大字符的正确字符图案。
    io:format("~ts~n",[X]).  %a∞b

八. 模式匹配

上面这张表里有一些模式与单位的例子,模式里的所有变量都假定未绑定过。单位(term) 就是指任何一种Erlang数据结构。表格的第二列(标记为结果)展示了模式与单位是否匹配,以 及匹配时会创建哪些变量绑定。请仔细阅读这些例子,确保真正理解了它们。

Erlang程序设计笔记---(第三节 Erlang的基本概念)相关推荐

  1. Erlang程序设计笔记---(第五节 Erlang的记录与映射组)

    导读 到目前为止,我们已经讨论了两种数据容器,分别是元组和列表.元组用于保存固定数量的 元素,而列表用于保存可变数量的元素. 本章将介绍记录(record)和映射组(map).记录其实就是元组的另一种 ...

  2. Erlang程序设计

    Erlang程序设计 讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程.异常处理.编译和运行代码.并发编程.并发编程中的错误处理.分布式编程.多核编程等内容.本书将帮助读者在消息传递的基 ...

  3. c语言程序设计笔记手写图片,C语言程序设计笔记.pdf

    陈立龙 (华中师范大学) C程序设计笔记( ) V1.06 一.C语言执行流程: 1.在C 语言中,一个C 语言源程序需要经过编译.连接和执行三个过程.其中编译是指将源程序 (*,c) 翻译成二进制形 ...

  4. C语言程序设计笔记(浙大翁恺版) 第九周:指针

    按照中国大学MOOC上浙江大学翁恺老师主讲的版本所作,B站上也有资源.原课程链接如下: https://www.icourse163.org/course/ZJU-9001 由于是大三抽空回头整理的, ...

  5. C语言程序设计笔记(浙大翁恺版) 第二周:计算

    按照中国大学MOOC上浙江大学翁恺老师主讲的版本所作,B站上也有资源.原课程链接如下: https://www.icourse163.org/course/ZJU-9001 由于是大三抽空回头整理的, ...

  6. C语言程序设计笔记(浙大翁恺版) 第三周:判断

    按照中国大学MOOC上浙江大学翁恺老师主讲的版本所作,B站上也有资源.原课程链接如下: https://www.icourse163.org/course/ZJU-9001 由于是大三抽空回头整理的, ...

  7. C语言程序设计笔记(浙大翁恺版) 第八周:数组

    按照中国大学MOOC上浙江大学翁恺老师主讲的版本所作,B站上也有资源.原课程链接如下: https://www.icourse163.org/course/ZJU-9001 由于是大三抽空回头整理的, ...

  8. C语言程序设计笔记(浙大翁恺版) 第七章:函数

    按照中国大学MOOC上浙江大学翁恺老师主讲的版本所作,B站上也有资源.原课程链接如下: https://www.icourse163.org/course/ZJU-9001 由于是大三抽空回头整理的, ...

  9. 北理工嵩天Python语言程序设计笔记(10 Python计算生态概览)

    前言 本文是对<北理工 嵩天/黄天宇/礼欣 Python语言程序设计>的学习笔记,供自己查阅使用. 文章目录 北理工嵩天Python语言程序设计笔记(目录) 北理工嵩天Python语言程序 ...

最新文章

  1. 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别
  2. 校园音乐点歌平台的设计与开发 微信小程序 推荐点歌 java 开发
  3. 求一个容器的最值的索引_殊途同归——从一道经典的多元最值问题说开
  4. Azure恢复服务-使用Windows Backup备份到云端
  5. nuxt 过滤 query 参数
  6. xp工作组计算机打不开,XP“网上邻居”、“查看工作组计算机”打不开及无法访问局...
  7. IP-guard应用攻略:如何防范外置网卡泄密
  8. CSS基础——CSS 三大特性【学习笔记】
  9. bat 指定hid驱动加载_Visual Paradigm:在数据库连接中为JDBC驱动程序使用参考路径...
  10. caj是什么格式的文件
  11. Labview2018学习之三:LabVIEW编程
  12. 双线性插值实现图像放大算法 matlab,FPGA/verilog实现双线性插值图像放大
  13. Linux系统备份系统还原
  14. php创建数组教程,PHP中使用array函数新建一个数组
  15. 电磁场与仿真软件(24)
  16. 一牛网:PCB layout设计培训:免费试听,可预约报名
  17. linux的xml文件格式,linux – 如何将非UTF-8格式的xml文件转换为符合UTF-8的xml
  18. Docker - 应用镜像
  19. jzoj5984. 【北大2019冬令营模拟2019.1.1】仙人掌 (分块)
  20. 解决WEEX/phantomjs-prebuilt安装太慢 weex安装卡在phantomjs-prebuilt不动的问题

热门文章

  1. 电脑摄像头一会好使一会不好使
  2. 开发中PG,PL,SE,PM都是什么意思
  3. ad打开ddb文件_如何用AD10打开DDB文件
  4. iOS WKWebView的使用以及遇到的问题
  5. 无人船成渡过大西洋将来发展又会如何?
  6. 干货分享:实用/高效/有逼格的Android Studio 常用配置/插件推荐
  7. 怎么定位html的坐标,css怎么定位图片的位置?
  8. 【机器学习基础】三层神经网络
  9. Tomcat原理 (持续更新
  10. Linux平台上DPDK入门指南(二)