Erlang中的表达式必须以.结束才会去执行。如果不加.你在编译环境下按多少次Enter,表达式都不会执行,表达式之间可以用,分隔,以.结尾后所有的表达式都会执行,但是只有最后一个以.结尾的表达式会在编译器中输出执行的结果。

一.值是表达式

任何类型的值都是表达式。如:

  1. 1.
  2. 3.5.
  3. 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中的精度排序如下:

  1. 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表达式

  1. if
  2. GuardSeq1 ->
  3. Body1;
  4. ...;
  5. GuardSeqN ->
  6. BodyN
  7. end

注意,If表达式必须要获得一个匹配,否则会抛出异常,所以一般可以将true做为最后一个guard expression。

八.Case表达式

  1. case Expr of
  2. Pattern1 [when GuardSeq1] ->
  3. Body1;
  4. ...;
  5. PatternN [when GuardSeqN] ->
  6. BodyN
  7. end

与If相比,Case更为强大,它不仅能进行条件判断,还能利用各种模式。Case表达式也必须获得一个匹配,否则会抛出异常,所以一般最后用_Else做一个通用匹配。

九.Send表达式

  1. Expr1 ! Expr2

Erlang的彪悍全体现在这里了,很简单,很强大的一个表达式啊。

这里的Expr1可以是一个process identifier(进行进程通信),可以是一个分布式的地址表示{Name,Node}(分布式通信),也可以是一个普通的name,总之对于任何一种接收信息的对象,任何一种信息,一个简单的!就把信息传出去了,够强大吧!

十.Receive表达式

  1. receive
  2. Pattern1 [when GuardSeq1] ->
  3. Body1;
  4. ...;
  5. PatternN [when GuardSeqN] ->
  6. BodyN
  7. end

形式类似于Case表达式,但是Receive表达式永远都不会报错,当信息到达时,如果信息能够被匹配,将会被处理,并从消息列表中移除。而接收到其他不匹配的信息也不会报错,只是会继续保存在消息列表中。当你调用Receive时,Receive会一直等待,直到一个能够匹配其中模式的信息到达。

为了避免消息等待时间过长,Receive引入了timeout机制:

  1. receive
  2. Pattern1 [when GuardSeq1] ->
  3. Body1;
  4. ...;
  5. PatternN [when GuardSeqN] ->
  6. BodyN
  7. after
  8. ExprT ->
  9. BodyT
  10. end

Receive将在ExprT表示的时间达到后退出,若ExprT为infinity则会一直等待。

十一. Begin...End表达式

  1. begin
  2. Expr1,
  3. ...,
  4. ExprN
  5. end

暂时没觉得这个表达式有啥用。

十二. Try,Catch,Throw

这个之后介绍啦

Erlang学习记录(三)——表达式大集合的更多相关文章

  1. JavaScript学习记录三

    title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  2. 3.VUE前端框架学习记录三:Vue组件化编码1

    VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  3. Spring学习记录(七)---表达式语言-SpEL

    SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...

  4. leveldb 学习记录(三) MemTable 与 Immutable Memtable

    前文: leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice 存储格式: leveldb数据在内存中以 Memtable存储(核心结构是skiplist 已介绍 ...

  5. Erlang学习记录(二)——基本数据类型

    Erlang可以说和我以前接触过的语言都大不相同,这个从它的类型定义就可以看出来...反正学起来觉得既不熟悉,也不亲切,我估计在用Erlang写应用的时候,整个编程思路都要变一下了.不过存在即是合理的 ...

  6. webrtc学习———记录三:mediaStreamTrack

    参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ...

  7. LoadRunner11学习记录三 -- 迭代和并发

    LoadRunner中%d和%s是什么意思? %d 格式化输出短整形数据,TC环境中占用两个字节,输出整数范围为:32768~32767.Visual C++环境中占用四个字节,输出数据范围为:-21 ...

  8. Erlang学习记录:语法和特性

    特性 大下排序:number < atom < reference < fun < port < pid < tuple < list < bit st ...

  9. Erlang学习记录(一)——Windows下的环境搭建

    一.安装编译器 在http://www.erlang.org/download.html下载R16B01 Windows Binary File并安装. 二.运行编译器 安装完编译器后,打开安装目录下 ...

随机推荐

  1. Quartz的Properties文件解析

    将可变信息放在properties文件是使配置更加灵活. 1.文档位置和加载顺序 1. StdSchedulerFactory默认加载quartz包下的quartz.properties文件,如果我们 ...

  2. vim 实现括号以及引号的自动补全

    编辑文件/etc/vim/vimrc sudo vim /etc/vim/vimrc 在最后添加 inoremap ( ()<ESC>i inoremap [ []<ESC>i ...

  3. Win7(64bit)搭建SVN

    开始: 第一步:下载SVN客户端程序TortoiseSVN并安装(不习惯英文操作界面的顺便在最底下下载一个语言包),下载地址tortoiseSVN下载(由于系统是64位的,我下载的是TortoiseS ...

  4. vue-混入mixin

    混入 基础 混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项. 例子: // ...

  5. C++之指针,引用与数组

    引用只是对象的另一个名字,通过在变量名前面添加"&”符号来定义,而指针保存的是另一个对象的地址,它们两都提供了间接访问所服务变量的途径. 但是它们的差别还是挺大的: 先从它们的值说起 ...

  6. centos rar 文件打开办法

    http://hi.baidu.com/nmxiaoxin/item/7642a139918a95677d034b6a Centos下解压rar.zip文件的方法 ============zip文件的 ...

  7. CF868F Yet Another Minimization Problem

    题目描述: 给定一个序列,要把它分成k个子序列.每个子序列的费用是其中相同元素的对数.求所有子序列的费用之和的最小值. 输入格式:第一行输入n(序列长度)和k(需分子序列段数).下一行有n个数,序列的 ...

  8. springmvc3 拦截器,过滤ajax请求,判断用户登录,拦截规则设置

    web.xml设置:(/拦截所有请求) <servlet> <servlet-name>dispatcher</servlet-name> <servlet- ...

  9. 关于指针pointer的位数与程序有关还是与系统有关、以及指针的指针的理解

  10. mysql5.7 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    mysql5.7初次登录使用提示 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before ...