Erlang程序设计[Part2 chapter5-chapter8]

news2024/11/19 11:16:28

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

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)
种写法能让程序的可读性更高。
用于调试。举个例子,假设编写如下代码:

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

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

相关文章

线上课堂知识付费小程序源码系统 全面升级+完整的安装包+搭建部署教程

系统概述 随着互联网的发展&#xff0c;线上教育和知识付费市场呈现出爆发式增长。线上课堂知识付费小程序源码系统为教育机构、培训师、个人创作者等提供了一个便捷、高效的平台&#xff0c;让他们能够将自己的知识和技能转化为实际收益。 代码示例 系统特色功能一览 1.拓展…

K8s的资源对象

资源对象是 K8s 提供的一些管理和运行应用容器的各种对象和组件。 Pod 资源是 K8s 中的基本部署单元&#xff0c;K8s通过Pod来运行业务应用的容器镜像 Job 和 CronJob 资源用于执行任务和定时任务&#xff0c;DaemonSet 资源提供类似每个节点上守护进程&#xff0c; Deployment…

【FAS】《Survey on face anti-spoofing in face recognition》

文章目录 原文基于手工设计特征表达的人脸活体检测方法基于深度学习的人脸活体检测方法基于融合策略的人脸活体检测方法人脸检测活体数据库点评 原文 邓雄,王洪春,赵立军等.人脸识别活体检测研究方法综述[J].计算机应用研究,2020,37(09):2579-2585.DOI:10.19734/j.issn.1001-3…

要颜值有颜值,有性价比有性价比,华硕天选键、鼠组合分享

作为ROG产品的忠实粉丝&#xff0c;用过不少ROG 相关的产品&#xff0c;近期华硕天选TX98和天选MINI 鼠标的发布&#xff0c;独特配色令我眼前一亮。 华硕天选TX98键盘&#xff0c;作为新品&#xff0c;从看上的第一眼就觉得这款键盘是非常值得推荐。 它完美地诠释了潮玩新次元…

扩散模型在时间序列预测中的兴起

摘要 本文探讨了扩散模型在时间序列预测中的应用。扩散模型在生成式人工智能的各个领域展示了最先进的成果。本文包括扩散模型的全面背景资料&#xff0c;详细说明了它们的调节方法&#xff0c;并回顾了它们在时间序列预测中的应用。分析涵盖了11个具体的时间序列实现&#xf…

20240613日志:大模型压缩方法COPAL

Location: Beijing 1 大模型剪枝 Fig. 1.1大模型压缩-剪枝 剪枝的分类&#xff1a;结构化修剪对于简化大型语言模型和提高其效率尤其相关。非结构化修剪关注的是选择性地去除单个权重&#xff0c;旨在消除网络中不那么关键的连接。 修剪的基于阶段的分类&#xff1a;修剪可以在…

zustand 状态管理库的使用 结合TS

zustand 是一个用于React应用的简单、快速且零依赖的状态管理库。它使用简单的钩子&#xff08;hooks&#xff09;API来创建全局状态&#xff0c;使得在组件之间共享状态变得容易。 React学习Day10 基本用法 安装&#xff1a;首先&#xff0c;你需要安装zustand库。 npm insta…

快速LLaMA:面向大型语言模型的查询感知推理加速 论文摘要翻译与评论

论文摘要翻译与评论 论文标题&#xff1a; QuickLLaMA: Query-aware Inference Acceleration for Large Language Models 提出的框架 我们Q-LLM框架的示意图。来自记忆上下文的输入被分割成记忆块&#xff0c;通过查询感知的上下文查找来搜索与查询相关的块。目前的键值缓存…

Ansys工程机械CAE应用白皮书

在工程机械领域&#xff0c;CAE技术已得到广泛而成功的应用&#xff0c;作为功能最全面、最有效高效也是全球用户数目最多的Ansys软件&#xff0c;在卡特皮勒&#xff08;Caterpillar&#xff09;、John Deere、LIEBHERR、ARDEN、三一重工、中联重科、JCB、VOLVO、小松 &#x…

Unity 之通过自定义协议从浏览器启动本地应用程序

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 之通过自定义协议从浏览器启动本地应用程序 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进…

微信朋友圈的高级玩法:让你的动态更吸引人

微信朋友圈作为一个展示个人生活和分享观点的平台&#xff0c;已经深入人们的日常生活。然而&#xff0c;随着用户数量的增加&#xff0c;如何在众多朋友圈动态中脱颖而出&#xff0c;成为许多人追求的目标。本文将介绍四种高级玩法&#xff0c;帮助你提升朋友圈的吸引力&#…

【Unity】加速Unity编辑器模式启动时间

Unity每次Play之后都会Reload Script Assemblies&#xff08;重新加载脚本程序集&#xff09;。 如果我们没有使用很多Assem&#xff0c;则并不需要在播放前重新编译。 可以在设置中将此事的重新编译关闭。 在Edit > Project Settings > Editor 面板中 找到Enter Play…

127.0.0.1与本机IP地址的区别

大家好&#xff0c;今天我们来聊聊一个在网络世界中常常被提及&#xff0c;但可能对于非专业人士来说还有些模糊的概念——127.0.0.1与本机IP地址。这两个地址在网络通信中都扮演着重要的角色&#xff0c;但它们之间又有着怎样的区别呢&#xff1f;让我们一起来探究一下。 一、…

关于JS中的.this

什么是.this? 在JavaScript中&#xff0c;this是一个非常重要的概念&#xff0c;它指的是函数执行的上下文对象。this的值取决于函数是如何被调用的&#xff0c;而不是在哪里被定义的。 .this的指向 在不同的场景中&#xff0c;.this指向并不是唯一的&#xff0c;下面举几个…

Java基础——异常详解(Error 与 Exception )

Java异常主要分为 Error 和 Exception 两种 Error&#xff1a; Error 类以及他的子类的实例&#xff0c;代表了JVM本身的错误。错误不能被程序员通过代码处理。 EXception&#xff1a; Exception 以及他的子类&#xff0c;代表程序运行时发送的各种不期望发生的事件。可以被J…

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chapter 10插图

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 Chapter 10插图

C# 索引器与迭代器分部类详情

文章目录 一、迭代器二、查看Foreach执行中间语言三、foreach实现过程总结四、实现迭代器最常用的方法五、分布类概述及其使用六、索引器概述及声明七、索引器在类中的使用八、索引器在接口中的使用九、总结 一、迭代器 1、迭代器&#xff08;iterator&#xff09;解决的是集合…

饮食中的隐形杀手,该如何避免?

塑料发明至今&#xff0c;口碑经历了过山车式的翻转。 上世纪&#xff0c;塑料曾被誉为20世纪最伟大的发明之一&#xff0c;围绕着塑料科学研究诞生出了好几位诺贝尔奖得主。 1953年&#xff0c;因在高分子化学方面的贡献&#xff0c;德国科学施陶丁格获诺贝尔化学奖&#xf…

Stable Diffusion 秋叶整合包v4.7 :解压即用,快速入门AI绘画

Stable Diffusion秋叶整合包&#xff0c;超简单一键安装Stable Diffusion&#xff0c;无任何使用门槛&#xff0c;完全免费使用&#xff0c;支持Nvdia全系列显卡&#xff0c;来自B站up秋葉aaaki&#xff0c;近期发布了Stable Diffusion整合包v4版本&#xff0c;一键在本地部署S…

中国各区域人口密度可视化图

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247674303&idx1&sn830304f80a0429406c4a5e38dc7750ec&chksmfa777682cd00ff9434e4660bb52ab2bf19913b6732083de061664401a9ac0fa46581cd9e5e86&token1445576002&langzh_CN&scene21#we…