Erlang程序设计[Part1-Part2 chapter4]

2024-06-19 00:12

本文主要是介绍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是一种表达式,而所有的表达式都应该有值

这篇关于Erlang程序设计[Part1-Part2 chapter4]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073456

相关文章

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

Python基础part1

Python基础 语法 字面量 数字 整数浮点复数布尔 字符串列表 list元组 Tuple集合 Set字典 Dictionary 注释 单行# 单行注释的内容多行“”“ 多行注释的内容 ”“” 单行注释#后要加一个空格再写注释 变量 变量无类型,但数据有类型 语法: 变量名 = 变量值 数据类型转换: int() str() float() 标识符 中文,英文,

JSP的增删改查part2

增加显示数据库表格cdsn的功能 1. 》》对CdsnDao接口和方法,CdsnService接口和方法进行处理,并增加CdsnServlet用于对新建展示页面进行处理 对cdsnDao接口和方法增加 》》接口 //获取cdsn用户数据列表 public List<cdsn> getCdsnList();》》CdsnDaoImpl增加内容//获得数据库所有数据publ

JSP的增删改查part1

运用Myeclisp对数据库进行增删改查 要建立6个库 1).其中dao层用与连接数据库和对数据库进行相关操作; 2).entity层用于存放数据库连接后的实体数据; 3.)service层是在mcv三层模式中新添加一层,能够更加清晰的定义应用程序的边界,需要操作数据的时候,通过service层访问DAO层来实现。

C语言程序设计 笔记代码梳理 重制版

前言 本篇以笔记为主的C语言详解,全篇一共十章内容,会持续更新基础内容,争取做到更详细。多一句没有,少一句不行!  形而上学者谓之道,形而下学者谓之器 形而上学者谓之道,形而下学者谓之器 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute)  2.

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

pta-2024年秋面向对象程序设计实验一-java

文章申明:作者也为初学者,解答仅供参考,不一定是最优解; 一:7-1 sdut-sel-2 汽车超速罚款(选择结构) 答案: import java.util.Scanner;         public class Main { public static void main(String[] arg){         Scanner sc=new Scanner(System

C语言程序设计(算法的概念及其表示)

一、算法的概念 一个程序应包括两个方面的内容: 对数据的描述:数据结构 对操作的描述:算法 著名计算机科学家沃思提出一个公式: 数据结构 +算法 =程序 完整的程序设计应该是: 数据结构+算法+程序设计方法+语言工具 广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。 对同一个问题,可有不同的解题方法和步骤。为了有效地进行解题,不仅需要保证算法正确,还要考虑算