Erlang学习记录(三)——表达式大集合
Erlang中的表达式必须以.结束才会去执行。如果不加.你在编译环境下按多少次Enter,表达式都不会执行,表达式之间可以用,分隔,以.结尾后所有的表达式都会执行,但是只有最后一个以.结尾的表达式会在编译器中输出执行的结果。
一.值是表达式
任何类型的值都是表达式。如:
1.
3.5.
true.
二.计算表达式
任何类型的值的计算是表达式。
1.算术表达式
+ 正号
- 负号
+ 加
- 减
* 乘
/ 浮点除
bnot 按位求反 bnot (-12) = 11
div 整除
rem 求余
band &
bor |
bxor 按位异或
bsl 按位左移 2#11 bsl 1 = 2#110.
bsr 按位右移 2#110 bsr 1 = 2#11.
2.Boolean表达式
not Expr
Expr1 and Expr2 永远计算Expr2的值
Expr1 andalso Expr2 如果Expr1为false,将不计算Expr2
Expr1 or Expr2 永远计算Expr2的值
Expr1 orelse Expr2 如果Expr1为true,将不计算Expr2
Expr1 xor Expr2 异或
3.List计算
Expr1 ++ Expr2将Expr2加入Expr1中
Expr1 -- Expr2将Expr2中的值从Expr1中删除
注意:List计算是右结合的运算符,另外List计算很慢,慎用。
4.运算符的优先级,从高到低:
:
#
Unary + - bnot not
/ * div rem band and
+ - bor bxor bsl bsr or xor
++ --
== /= =< < >= > =:= =/=
andalso
orelse
= !
catch
三.比较表达式
值之间的比较是表达式,Erlang的比较运算符看起来有些奇怪:
== ==
/= !=
=< <=
< <
>= >=
> >
=:= ===
=/= !==
Erlang中的精度排序如下:
number < atom < reference < fun < port < pid < tuple < list < bit string
当不同类型的值进行比较时,低精度的将转换为高精度的进行比较。
四.变量是表达式
1.变量必须以大写字母或下划线打头,且能包含数字,下划线和@
2.一个变量只能赋值一次。
3._是一种特殊的匿名变量,它可以用在任何需要变量但不需要使用该变量的地方,如下例:
[H|_] = [1,2,3]
这里我们只需要获取第一个item的值,所以后面可以用_
4.以下划线打头的变量和以大写字母打头的变量并不完全一样,以下划线打头的变量如果不被使用,不会产生warning,而以大写字母打头的变量会产生warning。
五.模式匹配是表达式
形如{X,Y}={1,2}即为模式匹配,做模式匹配要注意如下几点:
1.格式要匹配,
{A,B}=[1,2].将会抛出异常
2.长度要匹配
{A,B}={1,2,3}.或{A,B,C}={1,2}.将会抛出异常,对于不关注的字段可以用_来匹配,但是长度必须一致。
3.数据要一致
{A,1}={3,2}将抛出异常,必须用{A,1}={3,1}
六.函数调用是表达式
不管是直接调用函数,还是调用函数对象都是表达式。
我们要注意不要定义和BIFs一样的函数,如果必须要定义和BIFs一样的函数。如定义length函数,则需要将-compile({no_auto_import,[length/1]}).加入module定义中。
七.If表达式
if
GuardSeq1 ->
Body1;
...;
GuardSeqN ->
BodyN
end
注意,If表达式必须要获得一个匹配,否则会抛出异常,所以一般可以将true做为最后一个guard expression。
八.Case表达式
case Expr of
Pattern1 [when GuardSeq1] ->
Body1;
...;
PatternN [when GuardSeqN] ->
BodyN
end
与If相比,Case更为强大,它不仅能进行条件判断,还能利用各种模式。Case表达式也必须获得一个匹配,否则会抛出异常,所以一般最后用_Else做一个通用匹配。
九.Send表达式
Expr1 ! Expr2
Erlang的彪悍全体现在这里了,很简单,很强大的一个表达式啊。
这里的Expr1可以是一个process identifier(进行进程通信),可以是一个分布式的地址表示{Name,Node}(分布式通信),也可以是一个普通的name,总之对于任何一种接收信息的对象,任何一种信息,一个简单的!就把信息传出去了,够强大吧!
十.Receive表达式
receive
Pattern1 [when GuardSeq1] ->
Body1;
...;
PatternN [when GuardSeqN] ->
BodyN
end
形式类似于Case表达式,但是Receive表达式永远都不会报错,当信息到达时,如果信息能够被匹配,将会被处理,并从消息列表中移除。而接收到其他不匹配的信息也不会报错,只是会继续保存在消息列表中。当你调用Receive时,Receive会一直等待,直到一个能够匹配其中模式的信息到达。
为了避免消息等待时间过长,Receive引入了timeout机制:
receive
Pattern1 [when GuardSeq1] ->
Body1;
...;
PatternN [when GuardSeqN] ->
BodyN
after
ExprT ->
BodyT
end
Receive将在ExprT表示的时间达到后退出,若ExprT为infinity则会一直等待。
十一. Begin...End表达式
begin
Expr1,
...,
ExprN
end
暂时没觉得这个表达式有啥用。
十二. Try,Catch,Throw
这个之后介绍啦
Erlang学习记录(三)——表达式大集合的更多相关文章
- JavaScript学习记录三
title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- 3.VUE前端框架学习记录三:Vue组件化编码1
VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...
- Spring学习记录(七)---表达式语言-SpEL
SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...
- leveldb 学习记录(三) MemTable 与 Immutable Memtable
前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...
- Erlang学习记录(二)——基本数据类型
Erlang可以说和我以前接触过的语言都大不相同,这个从它的类型定义就可以看出来...反正学起来觉得既不熟悉,也不亲切,我估计在用Erlang写应用的时候,整个编程思路都要变一下了.不过存在即是合理的 ...
- webrtc学习———记录三:mediaStreamTrack
参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ...
- LoadRunner11学习记录三 -- 迭代和并发
LoadRunner中%d和%s是什么意思? %d 格式化输出短整形数据,TC环境中占用两个字节,输出整数范围为:32768~32767.Visual C++环境中占用四个字节,输出数据范围为:-21 ...
- Erlang学习记录:语法和特性
特性 大下排序:number < atom < reference < fun < port < pid < tuple < list < bit st ...
- Erlang学习记录(一)——Windows下的环境搭建
一.安装编译器 在http://www.erlang.org/download.html下载R16B01 Windows Binary File并安装. 二.运行编译器 安装完编译器后,打开安装目录下 ...
随机推荐
- perl发送post数据
把post数据写进一个匿名数组里就行 #!/usr/bin/env perl -w use strict; use LWP::UserAgent; my $ua = LWP::UserAgent-&g ...
- 【bzoj1923】外星千足虫
这个gauss消元有点naive啊. 由于只有01,位操作显然是方便的多. 那么用bitset代替之前的增广矩阵就行了. #include<bits/stdc++.h> #define N ...
- 数字签名(以ActiveXDemo为例)
1.创建Install.inf文件和run.bat Install.inf: [version] signature="$CHICAGO$" AdvancedINF=2.0 [Se ...
- leetcode 之Set Matrix Zeroes(10)
设置两个布尔数组,记录行和列是否存在0.需要注意的是如何将行或列设为0. void setZeros(vector<vector<int>> &matrix) { in ...
- 深入理解python多进程编程
1.python多进程编程背景 python中的多进程最大的好处就是充分利用多核cpu的资源,不像python中的多线程,受制于GIL的限制,从而只能进行cpu分配,在python的多进程中,适合于所 ...
- mysql 库操作、存储引擎、表操作
阅读目录 库操作 存储引擎 什么是存储引擎 mysql支持的存储引擎 如何使用存储引擎 表操作 创建表 查看表结构 修改表ALTER TABLE 复制表 删除表 数据类型 表完整性约束 回到顶部 一. ...
- 关于云平台中OFFICE预览与视频预览的解决办法
最近,随着firefox x64的升级,出现flash插件完全被禁止的现象,html5替换是大势所趋,原来我们在云平台中有多处使用flash的地方,比如OFFICE预览,视频播放,游戏等,现对于OFF ...
- WP的SEO工具汇总
Baidu Sitemap Generator 百度站点地图生成工具 https://wordpress.org/plugins/baidu-sitemap-generator/ This pulg ...
- 关于在ASP.NET MVC 中使用EF的Code First的方式来读取数据库时的Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
今天在做一个小网站的时候遇到很多问题唉,我还是个菜鸟,懂的也不多,今天一个表单的提交按钮用不了,都弄了几个小时唉.不过最后还是搞定了,还有浏览器有开发人员选项,不然我都不知道我还要继续排查多久哦,今天 ...
- 转:x64与x86的改变
http://tieba.baidu.com/p/1250470248 x64与x86的改变 硬件要求就是64位的CPU.操作系统也必须是64位的,如果在64位的CPU上安装了32位的操作系统,就算编 ...