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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css-Echarts图表柱状图,X轴横坐标值显示不完全问题

1.问题 在Echarts图表中当横坐标数值过多&#xff0c;或者数值过长时会导致部分横坐标不显示。数据量少或简单会默认显示完全&#xff0c;当放大时会导致部分横坐标隐藏。 更改第一个Mon字段名 会发现偶数横坐标显示隐藏&#xff1b; 2.解决方法 2.1 在x横坐标中添加interval…

CPU占用100%的解决办法

上课&#xff0c;先看问题 这里看有个.logrotate的进程占用CPU最高&#xff0c;这里就需要把这个清理掉 执行 ps aux | grep logrotate然后将这个进程杀掉 kill -9 3194067然后再看CPU占有率就下来了 下课

2024北京智源大会开幕,智源推出大模型全家桶及全栈开源技术基座新版图,大模型先锋集结共探AGI之路

2024年6月14日&#xff0c;第六届“北京智源大会”在中关村展示中心开幕。 北京智源大会是智源研究院主办的“AI内行顶级盛会”&#xff0c;以“全球视野、思想碰撞、前沿引领”为特色&#xff0c;汇聚海内外研究者分享研究成果、探寻前沿知识、交流实践经验。2024北京智源大会…

STM32学习和实践笔记(36):DAC数模转换实验

1.STM32F1 DAC简介 DAC&#xff08;Digital to analog converter&#xff09;即数字模拟转换器&#xff0c;它可以将数字信号转换为模拟信号。它的功能与ADC相反。在常见的数字信号系统中&#xff0c;大部分传感器信号被转化成电压信号&#xff0c;而 ADC 把电压模拟信号转换成…

哈尔滨等保测评流程

哈尔滨的等保测评程序是一项严格的、系统化的检测程序&#xff0c;其目的在于保证信息系统的安全、稳定。下面详细介绍了这个过程&#xff1a; 一、引言 随着信息技术的飞速发展&#xff0c;信息系统在各行各业中的应用越来越广泛&#xff0c;信息安全问题也日益凸显。为了保障…

【方法】如何隐藏和保护Excel表格中的敏感数据?

在工作中&#xff0c;很多人经常需要处理包含敏感信息的Excel表格。 为了确保这些数据的安全性&#xff0c;我们可以通过隐藏单元格、行和列&#xff0c;以及设置密码保护工作表的方法&#xff0c;来保护数据&#xff0c;下面一起来看看吧&#xff01; 一、隐藏数据&#xff1…

idea2020版本下载及注册

一。准备idea2020和BetterIntelliJ插件和补丁key 二、开始安装。 idea就正常安装&#xff0c;然后打开&#xff0c;选择试用30天打开即可&#xff0c;然后File - settings - plugins 点击 Install Plugin from Disk 然后选择BetterIntelliJ这个&#xff0c;这个后期不可变名称…

【数据分析】线性及逻辑回归模型和Python实现

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

聆思CSK6大模型+AI交互多模态开源SDK介绍

视觉语音大模型 AI 开发套件( CSK6-MIX )是围绕 CSK6011A 芯片设计的具备丰富语音图像功能与硬件外设的开发板&#xff0c;采用具备丰富组件生态的 Zephyr RTOS作为操作系统&#xff0c;官方提供了十几种开源SDK&#xff0c;包含大模型语音交互、大模型拍照识图、文生图、人脸识…

冒泡排序、选择排序

冒泡排序 按照冒泡排序的思想&#xff0c;我们要把相邻的元素两两比较&#xff0c;当一个元素大于右侧相元素时&#xff0c;交换它们的位置&#xff1b;当一个元素小于或等于右侧相邻元素时&#xff0c;位置不变 大的往右丢&#xff08;往下沉&#xff09;&#xff0c;小的往…

动手学深度学习(Pytorch版)代码实践 -深度学习基础-09过拟合与欠拟合

09过拟合与欠拟合 #通过多项式拟合来探索过拟合和欠拟合 #欠拟合是指模型无法继续减少训练误差。 #过拟合是指训练误差远小于验证误差。 import math import numpy as np import torch from torch import nn from d2l import torch as d2l import liliPytorch as lp#生成数据集…

数据驱动决策:工单统计工具如何赋能企业精准运营

在当今这个数字化飞速发展的时代&#xff0c;企业对于内部运营效率的追求已经达到了前所未有的高度。你是否曾为了繁杂的工单统计管理而头疼不已&#xff1f;是否曾因为无法准确进行工单统计数据而错失商机&#xff1f;今天&#xff0c;我将向你展示一款革命性的工单统计工具&a…

AI从云端到边缘:人员入侵检测算法的技术原理和视频监控方案应用

在当今数字化、智能化的时代&#xff0c;安全已成为社会发展的重要基石。特别是在一些关键领域&#xff0c;如公共安全、智能化监管以及智慧园区/社区管理等&#xff0c;确保安全无虞至关重要。而人员入侵检测AI算法作为一种先进的安全技术&#xff0c;正逐渐在这些领域发挥着不…

MySQl基础入门⑯【操作视图】完结

上一边文章内容 表准备 CREATE TABLE Students (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),email VARCHAR(255),major VARCHAR(100),score int,phone_number VARCHAR(20),entry_year INT,salary DECIMAL(10, 2) );数据准备 INSERT INTO Students (id, name, ema…

DolphinScheduler日志乱码、worker日志太多磁盘报警、版本更新导致不兼容怎么办?

作者 | 刘宇星 本文作者总结了在使用Apache DolphinScheduler过程中遇见过的常见问题及其解决方案&#xff0c;包括日志出现乱码、worker日志太多磁盘报警、版本更新导致不兼容问题等&#xff0c;快来看看有没有困扰你想要的答案吧&#xff01; DolphinScheduler集群环境有多…

AI大模型的策略布局:通用广度与垂直深度的融合之道

1. 设计理念&#xff1a; 通用大模型&#xff08;GeneralPurpose Large Models&#xff09;&#xff1a;旨在处理多种类型的任务&#xff0c;不特定于某个领域或应用。它们通常具有广泛的知识和能力&#xff0c;能够理解和生成自然语言、进行图像识别、解决数学问题等。 1. 广…

FileZilla证书过期,导致FileZilla Client联不上,或者老断开的处理

1、先到服务器上去重新生成一下证书&#xff0c;并且覆盖掉老的证书。edit--settings 输入信息&#xff0c;并且确认生成新的证书&#xff1a; 2、Client连接的时候&#xff0c;弹出证书信任&#xff0c;点击确认。 这样第一次连接&#xff0c;然后访问目录全都是好的&#xff…

如何开发盲盒小程序APP——入门指南

一、前言 随着盲盒经济的兴起&#xff0c;越来越多的开发者开始关注如何开发盲盒小程序APP。盲盒小程序不仅能为用户提供新颖的购物体验&#xff0c;还能为商家带来可观的利润。本文将为大家介绍如何入门开发盲盒小程序APP。 二、需求分析 目标用户&#xff1a;明确你的目标…

视频太大了怎么缩小内存

我们在分享视频的时候&#xff0c;有时候会遇到过视频文件太大&#xff0c;无法发送或者上传的情况&#xff0c;别担心&#xff0c;今天我就来给大家分享一个简单有效的方法&#xff0c;让你的视频变得更小&#xff0c;更方便分享&#xff01; 打开 “51视频处理官网 的网站。上…

如何使用CST软件敏感度分析 sensitivity analysis --- 天线F-ROM求解器

我们介绍一个自带案例&#xff0c;与直接使用参数配合频域ROM算法不同&#xff0c;这回我们演示constraint参数配合频域通用算法。以自带T分器为例&#xff1a; 其中有一个参数控制了金属柱的半径&#xff0c;初始值为1&#xff1a; 这个参数是个constraint&#xff0c;添加方法…