Erlang程序设计[Part2 chapter5-chapter8]

两种数据容器:元组、列表

part 2

chapter5 记录与映射组

记录

记录其实就是元组的另一种形式。通过使用记录,可以给元组里的各个元素关联一个名称
映射
映射组是 值对的关联性集合。
通过记录命名元组里的项
记录的产生背景:
对于小型元组而言,记住各个元素代表什么几乎不成问题,但当元组包含大量元素时,给各个元素命名就更方便了。一旦命名了这些元素,就可以通过名称来指向它们,而不必记住它们在元组里的具体位置。
定义一个记录(text默认是undefined)
语法:
-record(recored name(atom),{key(atom)=val,key=val,...})
todo:记录名
共享相同记录定义的方式:文件包含,类似c语言的.h文件
创建一个记录的实例
#todo{}.
X=#todo{status=weak,who=tsj,text="i am sleepy"}.  
复制一个记录
 X1=X#todo{}. 
匹配某个类型的记录
shell中撤销记录的定义
rf(record name)
映射组
映射 组里所有的键都必须是全绑定的数据类型
创建映射组

op是=> 或 :=

 键与值是有效的erlang类型

映射组在系统内部是作为有序集合存储的,打印时总是使用各键排序后的顺序
基于现有的映射组更新一个映射组

=>更新与添加 (总是成功)

:=更新(键不存在则更新失败)

tips:使用映射组的最佳方式是在首次定义某个键时总是使用 Key => Val ,而在修改具体某个键
的值时都使用 Key := Val

映射组模式匹配
key(bounded)=>val (unbounded)
#{born=>B}=Henry8.
在函数的头部使用包含模式的映射组,前提是映射组里所有的键都是已知的

注意:#{H=>N}=#{},模式匹配失败 

映射组排序
映射组在比较时首先会比大小(Size),然后再按照键(Key)的排序比较键和值
先Size后Key
映射组的输出与读取
输出: io:format 里的 ~p 选项输出
读取:用 io:read file:consult 读取

chapter6 顺序程序的错误处理

异常什么时候发生?

异常错误发生于系统遇到内部错误时

在代码里显式调用throw(Exception)、exit(Exception)或error(Exception)触发。

显示生成一个错误?

异常的捕捉(异常发生了如何处理)

用 try...catch 捕捉异常错误

工作方式:

首先执行FuncOrExpessionSeq。如果执行过程没有抛出异 常错误,那么函数的返回值就会与Pattern1(以及可选的关卡Guard1)、Pattern2等模式进行 匹配,直到匹配成功。如果能匹配,那么整个try...catch的值就通过执行匹配模式之后的表达 式序列得出。

如果FuncOrExpressionSeq在执行中抛出了异常错误,那么ExPattern1等捕捉模式就会与

它进行匹配,找出应该执行哪一段表达式序列。ExceptionType是一个原子(throw、exit和error

其中之一),它告诉我们异常错误是如何生成的。如果省略了ExceptionType,就会使用默认值

throw。

注:after代码一定会被执行,但是值不会返回

用 catch 捕捉异常错误

异常错误如果发生在catch语句里,就会被转换成一个描述此错误的{'EXIT', ...}元组。

捕捉一切可能的异常错误

栈跟踪

可以调用erlang:get_stacktrace()来找到最近的栈跟踪信息。

chapter7 二进制型与位语法

二进制型

二进制型( binary )是一种数据结构,它被设计成用一种节省空间的方式来保存大批量的原
始数据
二进制型的编写和打印形式是双小于号与双大于号之间的一列整数或字符串
在二进制型里使用整数时,它们必须属于 0 255 这个范围。
如果某个二进制型的内容是可打印的字符串, shell 就会将这个二进制型打印成字符串,否则就打印成一列整数。
位语法
位语法是一种表示法,用于从二进制数据里提取或加入单独的位或者位串。
假设要把三个变量( X Y Z )打包进一个 16 位的内存区域。
M=<<X:3,Y:7,Z:6>>
打包和解包 16 位颜色
打包
为什么shell打印<<23,180>>?
Red=2 :00010   Green=61:111101   Blue=20:10100
23:00010111
180:10110100
解包
位语法表达式
位语法表达式被用来构建二进制型或位串

用来构建二进制型或位串

Size的值指明了片段的大小 

TypeSpecifierList(类型指定列表)是一个用连字符分隔的列表,形式为End-Sign

Type-Unit。前面这些项中的任何一个都可以被省略,各个项也可以按任意顺序排列。如果省略

了某一项,系统就会使用它的默认值。

End可以是big | little | native

Sign可以是signed|unsigned

Type可以是integer|float|binary|bytes|bitstring|bits|utf8|utf16|utf32 默认值是integer

Unit的写法是unit:1|2|…256

位串:处理位级数据
Erlang 里,最小可寻址的存储单元是 1 ,位串里各个独立的位序列可以直接访问,无
需任何移位和掩码操作。

chapter8 Erlang顺序编程补遗

apply
内置函数 apply(Mod, Func, [Arg1, Arg2, ..., ArgN]) 会将模块 Mod 里的 Func 函数应用到Arg1, Arg2, ... ArgN 这些参数上
等价于 Mod:Func(Arg1,Arg2...)
算术表达式
数字-->整数、浮点数
优先级相同:从左往右求值
使用(),()内表达式优先级最高
属性
预定义的模块属性
-module  模块声明
-import   导入函数,在本模块内调用这些函数不用加模块名
-export  ([Name1/Arity1, Name2/Arity2, ...]).   导出当前模块里的 Name1/Arity1 Name2/Arity2 等函数
-compile(options)   添加 Options 到编译器选项列表中
-vsn   指定模块的版本号。
用户定义的模块属性
使用 module_info/0 module_info/1获取模块属性
布尔值
原子 true false 具有特殊的含义,可以用来表示布尔值。
布尔表达式
B1 B2 都必须是布尔值或者执行结果为布尔值的表达式
动态代码载入
每当调用 someModule:someFunction(...) 时,调用的总是最新版模块里的最新版函数,哪怕当代码在模块里运行时重新编译了该模块也是如此
在任一时刻, Erlang 允许一个模块的两个版本同时运行:当前版和旧版。
转义序列
表达式和表达式序列
Erlang 里,任何可以执行并生成一个值的事物都被称为 表达式 expression )。
函数引用
包含文件
-include(Filename)
Filename  含一个绝对或相对路径
包含库的头文件
-include_lib(Filename)
Erlang 的宏以如下方式编写:
$ 写法
$C 这种写法代表了 ASCII 字符 C 的整数代码。因此, $a 97 的简写, $1 49 的简写
进程字典
每个 Erlang 进程都有一个被称为 进程字典 process dictionary )(即map)的私有数据存储区域
使用BIF对进程字典做操作
引用
创建独一无二的标签,把它存放在数据里并在后面用于比较是否相等
erlang:make_ref() 创建
短路布尔表达式
全排序(total ordering)的定义
下划线变量
_VarName 这种特殊语法代表一个常规变量( normal variable),而不是匿名变量。
注意:
一般来说,当某个变量在子句里只使用了一次时,编译器会生成一 个警告
下划线变量有两种主要的用途。
命名一个我们不打算使用的变量。例如,相比 open(File, _) open(File, _Mode)
种写法能让程序的可读性更高。
用于调试。举个例子,假设编写如下代码:

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

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

相关文章

反射的原理和操作

反射是框架设计的灵魂 &#xff08;使用的前提条件&#xff1a;必须先得到代表的字节码的Class&#xff0c;Class类用于表示.class文件&#xff08;字节码&#xff09;&#xff09; 在Java中&#xff0c;反射是指在运行时动态地获取、检查和操作类、对象、方法和属性的能力。J…

本地部署AI模型-phi3

What&#xff1a; Phi-3-Mini被认为是Microsoft计划发布的三款小型机型中的首款。据报道&#xff0c;在语言、推理、编码和数学等领域&#xff0c;它在各种基准测试中的表现优于相同大小和下一个尺寸的模型。 从本质上讲&#xff0c;语言模型是 ChatGPT、Claude、Gemini 等 AI…

各类存储器类型(RAM、ROM、FLASH、DRAM、SRAM)

1 计算机存储类型构成 在计算机中&#xff0c;各类存储器构成了计算机能高速高效运转程序的基石。 计算机的存储体系中&#xff0c;从速度慢到速度快对应着容量大到小&#xff0c;也就是说&#xff0c;速度越快容量越小&#xff1b;容量越大的&#xff0c;速度越慢。两者互相…

【Python教程】如何搭建一个高效的Python开发环境?结尾附安装包直通车

前言&#xff1a; Python 丰富的函数库和组件库是这门语言强大的核心原因&#xff01;但我们不可能去记忆所有的方法名和参数名&#xff0c;往往只能记住一些常用的或者某个方法开头的几个字母。这个时候一个好的开发工具就需要能聪明地“猜”出你想输入的代码&#xff0c;并给…

怪物猎人物语什么时候上线?游戏售价多少?

怪物猎人物语是一款全新的RPG游戏&#xff0c;玩家在游戏中将化身为骑士&#xff0c;不断与怪物建立羁绊、不断成长&#xff0c;踏上前往外面世界的旅程&#xff0c;且最终目的地是以狩猎怪物为生的猎人世界。因为最近有不少玩家在关注这款游戏&#xff0c;所以下面就给大家分享…

福昕PDF编辑器快速去除PDF水印方法

在福昕PDF编辑器软件中打开一个带有水印的PDF文件&#xff0c;点击如图下所示的页面管理->水印&#xff0c;点击全部移除 点击 是 水印消除&#xff08;注&#xff1a;部分类型的水印可以消除&#xff0c;但是有些类型的水印无法通过此方法消除&#xff09;

day38-39| 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 62.不同路径 343. 整数拆分 96.不同的二叉搜索树

文章目录 前言动态规划理论基础509. 斐波那契数思路方法一 完整动态规划方法二 dp简化版方法三 使用递归 70. 爬楼梯思路方法一 动态规划方法一2 教程里面的简化方法方法二 拓展 746. 使用最小花费爬楼梯思路方法一方法二 拓展 62.不同路径思路 动态规划方法一方法二 递归 63. …

Java变量:声明、作用域和命名约定

Java变量&#xff1a;声明、作用域和命名约定 什么是变量&#xff1f; 在Java中&#xff0c;变量是保存特定数据类型值的内存位置的名称。它是java编程中的一个基本概念&#xff0c;允许您在程序执行期间存储和操作数据。 Java中的变量可以保存各种类型的数据&#xff0c;包括…

市值飙升!超微软、苹果,英伟达成为全球市值最高上市公司

KlipC报道&#xff1a;当地时间6月18日&#xff0c;英伟达股价再度大涨&#xff0c;盘后股价上涨3.51%&#xff0c;总市值达3.335万亿美元&#xff0c;报135.58美元再刷历史新高&#xff0c;超微软、苹果成为全球市值最高的上市公司。 值得一提的是&#xff0c;在本月初&#x…

记录一次mysql长事务的经历

目录 一.项目介绍 二.问题暴漏 三.问题排查 1.连接池方向 2.数据库方向 四.代码模拟 五.错误原因分析 1.MySQL参数优化 2.代码优化 六.总结 一.项目介绍 项目是springbootnacos的微服务架构,商城购物类系统,分多个服务,问题出现在众多服务中的单个服务 二.问题暴漏…

【AI学习】LLaMA 系列模型的进化(一)

一直对LLaMA 名下的各个模型关系搞不清楚&#xff0c;什么羊驼、考拉的&#xff0c;不知所以。幸好看到两篇综述&#xff0c;有个大致了解&#xff0c;以及SEBASTIAN RASCHKA对LLaMa 3的介绍。做一个记录。 一、文章《Large Language Models: A Survey》中对LLaMa的介绍 论文…

解决 执行 jar 命令 控制台乱码

Springboot项目&#xff0c;编码为utf8 打包后&#xff0c;为了在控制台运行时不乱码&#xff0c;需要在控制台中依次执行以下命令&#xff1a; 第一步&#xff1a; chcp 65001第二步&#xff1a; java -jar -Dfile.encodingutf-8 你的.jar

【GUI软件】小红书蒲公英数据批量采集!高效筛选优质博主,助力品牌商

文章目录 一、背景介绍1.0 爬取目标1.1 演示视频1.2 软件说明 二、代码讲解2.0 关于接口2.1 爬虫采集模块2.2 cookie获取2.3 软件界面模块2.4 日志模块 三、获取采集软件 一、背景介绍 1.0 爬取目标 众所周知&#xff0c;蒲公英是小红书推出的优质创作者商业合作服务平台&…

《庆余年》在前,《玫瑰的故事》在后,阅文发现“新大陆”?

奋笔疾书的网文作家&#xff0c;即将迎来网络文学的高光时代。 近日&#xff0c;阅文集团于安徽省举办2024阅文创作大会。现场数据显示&#xff0c;2023年阅文活跃作家平均收入增长32%&#xff0c;创造近五年最大增幅。其中&#xff0c;中位数作家收入增幅达135%&#xff0c;已…

SSH 远程执行任务

SSH 是 Linux 下进行远程连接的基本工具&#xff0c;但是如果仅仅用它来登录那可是太浪费啦&#xff01;SSH 命令可是完成远程操作的神器啊&#xff0c;借助它我们可以把很多的远程操作自动化掉&#xff01;下面就对 SSH 的远程操作功能进行一个小小的总结。 远程执行命令 如…

ThreeJS-截屏下载pdf或者图片时白屏

JS-页面截图下载为pdf 关于如何下载为 pdf 在上面的这篇文章中有写&#xff0c;大家可以看下&#xff0c;下载图片代码在最下面 这时我们发现 three 部分是空白的如下&#xff1a; 这就多少有点尴尬了&#xff0c;这时我们习惯性的看下后台报错 是不是发现了惊喜&#xff0c;…

操作系统 内存管理

实验目的&#xff1a; 理解虚拟内存在内存管理中的核心作用。掌握常见的内存分配回收算法思想。 实验内容&#xff1a; 编程模拟实现内存伙伴buddy分配器。 实验步骤&#xff1a; 1.理解Buddy分配算法原理&#xff1a; 在开始编码之前,先要深入理解Buddy分配算法的原理。…

Web应用安全测试-综合利用(二)

Web应用安全测试-综合利用&#xff08;二&#xff09; Host头攻击 漏洞描述 Web应用程序获取网站域名一般是依赖HTTP Host header&#xff08;比如在JSP里通过request.getHeader()获取&#xff09;&#xff0c;这里的header很多情况下是不可靠的。 攻击者恶意利用HTTP Host h…

小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析【二】

前面两期博文; 小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析 小米机型解锁bl 绕过社区等级5才可以解锁的限制的教程_没有五级社区怎么解锁bl-CSDN博客 小米对米粉解锁bl是越来越苛刻了。目前社区等级 答题 审核等等步骤越来越繁琐。而且通过率很低。知名开…

细说MCU输出互补型PWM波形时设置死区时间的作用

目录 一、工程背景 二、死区时间的作用 一、工程背景 在作者的文章里建立工程时&#xff0c;为配置输出互补型PWM波形曾经设置了死区时间&#xff0c;DEAD100个定时器的时间周期&#xff08;简称实例1&#xff09;&#xff1a;细说MCU输出互补型PWM波形的实现方法-CSDN博客 …