Erlang程序设计[Part1-Part2 chapter4]

news2025/4/9 3:53:43

前言:

环境安装

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是一种表达式,而所有的表达式都应该有值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

批量导出兜底回复对话,迭代优化聊天机器人 | Chatopera 云服务

持续优化知识库 聊天机器人的知识库&#xff0c;对话技能&#xff0c;需要长期的优化。这是因为&#xff0c;一方面&#xff0c;初期上线的机器人所依赖的数据量通常有限&#xff1b;另一方面&#xff0c;市场不断变化&#xff0c;客户产品新的问题。 上线聊天机器人的目的之…

MyBatis Plus Generator代码生成

一、MyBatis Plus Generator MyBatis Plus是一个功能强大的持久层框架&#xff0c;它简化了MyBatis的使用&#xff0c;提供了许多便捷的功能。其中&#xff0c;MyBatis Plus Generator是一个强大的代码生成器&#xff0c;可以帮助我们快速地根据数据库表结构生成对应的实体类、…

怎么控制多个存储设备的访问权限?数据安全存储方案来了

数据安全存储是指将数据以安全的方式存储在存储系统中&#xff0c;以确保数据的机密性、完整性和可用性。要控制数据安全存储的权限以保障安全&#xff0c;可以采取以下措施&#xff1a; 访问控制列表&#xff08;ACLs&#xff09;&#xff1a;使用ACLs来定义对存储数据的访问权…

丹麦海外媒体报道:媒体投放发稿助力企业在海外扭转战局

大舍传媒 丹麦海外媒体报道中&#xff0c;大舍传媒作为一家专业的媒体投放公司&#xff0c;正发挥着重要作用&#xff0c;帮助企业在海外扭转战局。作为丹麦领先的媒体投放机构&#xff0c;他们为企业提供了全方位的品牌传播服务&#xff0c;帮助企业在海外市场取得成功。 大舍…

MySQL 架构

本篇主要介绍一下MySQL的架构 目录 一、整体架构 二、连接层 网络端口 连接管理线程 三、服务层 NoSQL接口与SQL接口 Parser&#xff08;语法分析器&#xff09; Optimizer&#xff08;查询优化器&#xff09; Cache & Buffers(缓存&#xff09; 四、存储引擎层…

可复用验证的测试用例 5大编写技巧

编写可复用验证的测试用例&#xff0c;节省了编写新测试用例的时间和资源&#xff0c;提高了测试效率和项目质量&#xff0c;减少错误修复成本&#xff0c;有利于实现较高的投入产出比。缺乏可复用的测试用例会导致测试团队不断重复创建相似的测试场景&#xff0c;消耗大量时间…

CleanMyMac中文版2024破解版安装包下载最新官方免费激活码

CleanMyMac中文版&#xff0c;让你的电脑焕然一新&#xff01; 大家好&#xff0c;今天我要给大家推荐一款神奇的软件——CleanMyMac中文版。作为一个长期使用Mac的用户&#xff0c;我一直在寻找一款能够彻底清理电脑垃圾和优化系统的工具&#xff0c;而CleanMyMac正是我心心念…

封装音视频编解码和渲染的动态链接库编译和测试

1.动态链接库的编译 生成了以下几个文件 我们把生成的lib文件复制到lib文件夹中 其余三个文件不变动 2.进行测试看是否可以用生成的xcodec.lib库文件里的接口函数 以上是重新创建的新项目&#xff0c;导入了xcodec.lib&#xff0c;其他配置同以前项目 库测试结果 运行显示我们…

优思学院|精益生产10大工具全解析

精益生产是一种管理哲学&#xff0c;其核心思想是通过消除浪费、持续改进和最大化价值来提高企业效率和效益。本文将详细解析精益生产的10大工具&#xff0c;帮助企业更好地理解和实施精益生产&#xff0c;以实现卓越的经营绩效。 一、价值流图 (Value Stream Mapping) 前言 …

大模型的分类:探索多样化的人工智能模型

随着人工智能技术的飞速发展&#xff0c;大型预训练模型&#xff08;以下简称“大模型”&#xff09;已经在自然语言处理、计算机视觉、语音识别等多个领域取得了显著的成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任…

C#标志位的使用

C#作为一种功能强大的编程语言&#xff0c;是在.NET框架中广泛使用的语言之一。在实际应用中&#xff0c;C#的标志位在各种系统设计和编程实践中会涉及到。这篇文章将讨论如何使用C#的标志位来跟踪报警声音的播放状态。 报警系统是一种广泛应用的系统&#xff0c;它可以在关键时…

软件性能测试之负载测试、压力测试详情介绍

负载测试和压力测试是软件性能测试中的两个重要概念&#xff0c;它们在保证软件质量和性能方面起到至关重要的作用&#xff0c;本文将从多个角度详细介绍这两种测试类型。 一、软件负载测试   负载测试是在特定条件下对软件系统进行长时间运行和大数据量处理的测试&#xff…

shell脚本中的变量

关于Linux操作系统中当前shell进程与子shell进程的详细解释 如上图所示&#xff0c;使用ps -f可以当前查看Linux操作系统中当前正在运行的进程。 然后敲bash后&#xff0c;相当于在当前的bash shell环境下又创建了一个子bash shell的进程&#xff0c; 如上图所示&#xff0c;…

Apache Druid-时序数据库

Apache Druid&#xff1a;是是一个集时间序列数据库、数据仓库和全文检索系统特点于一体的分析性数据平台&#xff0c;旨在对大型数据集进行快速的查询分析&#xff08;"OLAP"查询)。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景&…

手把手带你实现一个简单的轮播图

轮播图现有成熟的插件非常多&#xff0c;但做为一名学习中的想要成为前端开发的小伙伴们来说&#xff0c;自己动手实现一个轮播图&#xff0c;还是很锻炼的&#xff0c;实现完成后&#xff0c;也是很有成就感的。下面&#xff0c;我们来实现一个简单的轮播图吧。 目录 1 HTML …

DIY一个PE启动盘

原文&#xff1a;https://blog.c12th.cn/archives/18.html 前言 有天&#xff0c;朋友问我有没有带集成软件的U盘启动盘。我也是很久没有弄启动盘了&#xff0c;有次在逛b站时无意中看到还有可以DIY的启动盘&#xff0c;于是就教程就来了… 该两种方法&#xff0c;已在三台实体…

SCADA软件地毯式介绍,你想知道的都在这里.

很多小伙伴对SCADA很陌生&#xff0c;殊不知这个可是智慧工业制造的大脑和中枢神经&#xff0c;很多指令的发出&#xff0c;监控状态的现实都得通过这个系统&#xff0c;本文详解介绍一下什么是SCADA&#xff0c;重大作用&#xff0c;其在工业制造中的位置&#xff0c;以及市面…

停车场控制机系统哪家好?捷顺捷曜分体式车场控制机有哪些功能亮点?

停车场控制机为现代城市提供了许多便利和好处。首先&#xff0c;它能够自动记录车辆进出的时间&#xff0c;便于车主和管理人员进行费用计算。其次&#xff0c;通过车牌识别技术&#xff0c;提高了车辆进出的效率&#xff0c;减少了排队等待时间。此外&#xff0c;控制机还可以…

【Pepper机器人开发与应用】二、Pepper机器人图形化开发:医疗服务机器人程序设计

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f4d1;上期文章&#xff1a;『【Pepper机器人开发与应用】一、教你如何使用图形化开发软件高效开发pepper机器人&#xff08;Pepper SDK for LabVIEW&#xff09…

MFC开发 解决:VSstudio2019 无法打开afxwin.h 或 安装afxwin.h

在进行MFC开发的学习中&#xff0c;在win10系统下使用vs studio2019进行mfc开发&#xff0c;出现的标题的问题 首先&#xff0c;如果你以及安装过了afxwin.h相关环境 那么按照如下步骤 首先 打开工程的属性 在 高级——MFC的使用——选择在共享DLL中使用MFC 如下 …