Erlang程序设计[Part1-Part2 chapter4]

前言:

环境安装

Erlang Shell,CSDN搜教程 

 Erlang Shell实操 

启动 erl

Erlang Shell以表达式为执行单位?

结束标志 .加上回车

Part1 为何用 Erlang

chapter 1 什么是并发

并发vs并行

并发 单核cpu运行多个进程 一次运行一个

并行 多核cpu同时运行多个进程

给并发建模

场景:

看见四个人出去散步,另外还有两条狗和一大群兔子。这些人正在相互交谈,而狗则想要追逐兔子。
建模
编写四个模块,名字分别是 person (人)、 dog (狗)、 rabbit (兔子)和world (世界)。

以person模块为例,person的代码会放在名为person.erl的文件里

每行分别是什么意思?

-module(person). 的意思是此文件包含用于 person 模块的代码, (person.erl->,module(person))
person.erl是文件名 person是模块名 注意:模块名必须是小写 模块名是一个原子(atmo)原子是什么?
-export([init/1]).是一条 导出声明。意思是带有一个参数(/1指的就是这个意思,而不是除以1)
的函数 init 可以在模块外调用。
导出声明指明了模块里哪些函数可以从模块 外部进行调用,类似C++的public,没有包括在导出声明里的函数是私有的,无法在模块外调用
多条声明
[]是列表
如何启动一个程序?
场景:world模块

spawn是什么?

 基本函数,它会创建一个并发进程并返回一个进程标识符。

执行流程: 

Erlang 运行时系统执行 spawn 时,它会创建一个新进程(不是操作系统的进程,而是一个
Erlang 系统管理的轻量级进程)。当进程创建完毕后,它便开始执行参数所指定的代码

参数详解

ModName 是包含想要执行代码的模块名

FuncName是模块里的函数名

[Arg1, Arg2, ...]是一个列表,包含了想要执行的函数参数

返回值 进程标识符

执行person模块中,init函数,函数参数是Joe
场景:Joe与Susannah互发消息
Joe 发生消息给 Susannah:
什么意思? 
Pid !Msg,是发送消息Msg到进程Pid。大括号里的self()参数标明了发送消息的进程(在此处是Joe)
Susannah接收消息

收到消息时,From为绑定为发生消息的进程,Message则是要回复的消息

 Erlang里,并发性由Erlang虚拟机提供,Erlang是一种并发编程语言

chapter 2 Erlang速览

=操作符

= 不是一个赋值操作符,它实际上是一个 模式匹配操作符

注意:Erlang中变量只能被绑定一次,即变量所指内存内容不能被改变,是一次性赋值变量

Erlang 里,变量只不过是对某个值的引用: Erlang 的实现方式用指针代表绑定变量,指向
一个包含值的存储区。这个值不能被修改。

 

变量和原子

变量:Erlang 的变量以大写字母开头
原子:以小写字母开头的名称(比如monday或friday)是符号常量,它们被称为原子(atom)
退出shell ctrl+c+a(abort)
进程、模块和编译
Erlang 程序是由许多并行的进程构成的。进程负责执行模块里定义的函数。模块则是扩展名
.erl 的文件,运行前必须先编译它们。编译某个模块之后,就可以在 shell 或者直接从操作系统
环境的命令行里执行该模块中的函数了。

 
TODO:需要搞清楚的是:
在VSCode中 是用的什么编译器?或者说 Erlang代码生成可执行程序的流程
shell到底是个什么东西?shell是自带编译器吗?操作系统是自带编译器的吗?终端又是什么?
返璞归真:在 shell 里编译并运行 Hello World
在VSCode,创建了hello.erl并且编写了如下代码:
ctrl ~启动VSCode内终端
上述代码做了什么?
c(hello) 命令编译了 hello.erl 文件里的代码
2 行里执行了 hello:start() 函数
3 行里停止了 Erlang shell
第一个并发程序:文件服务器
Erlang 的基本并发单元是 进 程( process )。一个进程是一个轻量级的虚拟机,只能通过发送和接收消息来与其他进程通信。
场景:文件服务器 两台机器间相互传输文件
文件服务器: afile_server
receive end间的模式匹配:
Erlang 编译器和运行时系统会正确推断出如何在收到消息时运行适当的代码。不需要编写任
何的 if-then-else switch 语句来设定该做什么
如下做了什么?
1>编译模块
2>用FileServer接受进程pid
3>以shell本身发送消息给FileServer
客户端
CS交互

Part2 顺序编程

Erlang相关
安全的关闭erlang shell  
q()
erlang shell、 VsCode中添加注释 使用%

erlang shell内快捷键

 

chapter 3 基本概念

整数运算

erlang中整数运算 没有位数限制

浮点数操作

/ div rem

/:计算浮点数结果

div:取整

rem:取余

原子

Erlang里,原子被用于表示常量值。原子是全局性

原子以小写字母开头,后接一串字母、数字、下划线( _ )或 at @ )符号,例如 red december 、 cat、 meters yards joe@somehost a_long_name
原子还可以放在单引号( ' )内。可以用这种引号形式创建以大写字母开头(否则会被解释
成变量)或包含字母数字以外字符的原子,例如 'Monday' 'Tuesday' '+' '*' 'an atom
with spaces'

单引号与双引号:

erlang中单引号用于表示大写字母开头的原子;

双引号用于给字符串字面量(string literal )定界。
一个原子的值就是它本身
元组
把固定项目的实体 归组成 单一的实体就可以使用元组,类似 C的结构体,只是元组是匿名的
{,,,}
为了更容易记住元组的用途,一种常用的做法是将原子作为元组的第一个元素,用它来表示元组是什么。
元组的嵌套
假如想要表示某人的一些情况(名字、身高、鞋码和眼睛颜色),就可以 像下面这么写:
创建元组
元组会在声明它们时自动创建不再使用时则被销毁
erlang具有内存泄漏的问题吗?
Erlang 使用一个垃圾收集器来回收所有未使用的内存,这样就不必担心内存分配的问题了。
元组的赋值
元组的值提取
_: 用于表示不感兴趣的那些变量,称为匿名变量,可以被绑定为多个值
列表
用于存放任意数量的事物
[列表元素],列表元素可以是任意类型
[1,2,3,4]
1被称为列表头
4被称为列表尾
[H|T]
|分割头尾
需要确保T是一个列表
字符串
erlang中字符串表示
1.双引号
2.列表中放可显字符的ASCII码
f()让shell清空所有的绑定

chapter 4模块与函数

模块
模块是 Erlang 的基本代码单元。模块保存在扩展名为 .erl 的文件里,而且必须先编译才能运
行模块里的代码。编译后的模块以 .beam 作为扩展名。

area是函数名()内是一个函数(因为是一个元组) 函数方法用->分割,当匹配成功时调用对应方法。函数内部用;做分隔符 。函数内部由各个子句构成,函数隐式的返回值是最后一条子句的值

补充:

,-->and

;-->or

.  -->done

fun:基本的抽象单元

Erlang是一种函数式编程语言。此外,函数式编程语言还表示函数可以被用作其他函数的参

,也可以返回函数

fun是匿名的,你可以使用fun定义任何方法,但是他们统称为fun

定义fun

使用fun

fun可以有任意数量的参数

fun内定义多个子句

 注意 要以end.结尾

以fun作为参数的函数

lists:map/2   map(F,L)

列表L中的每个元素都应用到F函数中,返回一个列表

lists:filter(P, L)

返回一个列表,列表中存储的是true值(P(E)==true),Even(E)==true

map和filter等函数能在一次调用里对整个列表执行某种操作,我们把它们称为一次一列表 (list-at-a-time)式操作。

返回fun的函数

Mult其实就是fun(Times)... end.

Mult(3) 返回的就是 3*X end,所以Tripe就是3*X end

erlang中归集器、和构建自然顺序的列表?

定义自己的控制抽象

定义一个for循环

简单列表处理

列表推导

是无需使用fun、map或filter就能创建列表的表达式

使用列表推导使列表中元素扩大2倍

[ F(X) || X <- L]标记的意思是“由F(X)组成的列表(X从列表L中提取)”。因此,[2*X || X <- L ]的意思就是“由2*X组成的列表(X从列表L中提取)”。

内置函数(BIF build in function)

内置函数能提供操作系统的接口,并执行那些无法用Erlang编写或者编写后非常低效的操作。

内置函数的使用:

内置函数是自动导入的,因此不需要指明模块

关卡

1.用于函数主体做判断条件

2.用于作为表达式,返回值是true or false

关卡序列

关卡序列(guard sequence)是指单一或一系列的关卡,用分号(;)分隔

对于关卡序列G1; G2; ...; Gn,只要其中有一个关卡(G1、G2……)的值为true,它的值就为true。

关卡

由一系列关卡表达式组成,用逗号(,)分隔。关卡GuardExpr1, GuardExpr2, ... , GuardExprN只有在所有的关卡表达式(GuardExpr1、GuardExpr2……)都为true时才为true。

true关卡的作用

true关卡表达的就是一定匹配。

case 和 if 表达式

case表达式

语法

首先,Expression被执行,假设它的值为Value。随后,Value轮流 与Pattern1(带有可选的关卡Guard1)、Pattern2等模式进行匹配,直到匹配成功。一旦发现 匹配,相应的表达式序列就会执行,而表达式序列执行的结果就是case表达式的值。如果所有模式都不匹配,就会发生异常错误(exception)。

if表达式

语法

注意:if表达式必须至少有一个关卡的执行结果为true,否则就会发生异常错误。

很多时候,if表达式的最后一个关卡是原子true,确保当其他关卡都失败时表达式的最后部分会被执行。

因为if是一种表达式,而所有的表达式都应该有值

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值