## 1. 变量
### 1.变量不变
在erlang中的变量只能被赋值一次,变量第一个字母要是大写的。
在erlang中变量是不可变的,也没有共享内存的概念,也没有锁。
### 2.模式匹配
符号”=”是值类型匹配操作(带有赋值的意思)。(pattern matching)
* * * * *
## 2.整数
一个整数
```erlang
-234 0 10 10000000
2#1010
-16#EA
$a $A $\n
1> Color = 16#F09A29.
15768105
2> Pixel = <<Color:24>>.
<<240,154,41>>
```
Erlang中整型数据的计算是精确的,整型变量可代表的数据长度仅受限于可用的内存。
Erlang中可表达和使用任意大的整数。当一个整数大到一个word不能容纳的时候,Erlang内部会自动把它转换成用多个word表示的bignums类型。
可以用下面3种不同的语法来表达一个整型数值。
1. 传统语法:这种写法是我们最为熟悉的,比如1112. 12375、-23427都是整数。
2. K进制整数:不以10为进制的整数可以用语法K#Digits来表示。因此我们可以写一个二
进制数2#00101010或者一个16进制数16#af6bfa23。对于大于10进制的整数,用字符abc...(或
ABC二。)来表示数值10. 11, 12等。这种语法所能表示的最高进制为36进制。
3. $语法:语法$C表示ASCII字符C的整数值,因此$a是97的简写,$1是49的简写,等等。
紧随$之后,我们还可以使用表5-1中描述的任何转义符。因此$\n就是10, $\^c是3,等等。
下面是一些整数的例子:
0 -65 2#010001110 ~8#377 16#fe34 16#FE34 36#wow
(它们的值分别是0 -65 142 -255 65076 65076和423680)
Base#Value符号表示基数不是10的整数 Base是一个介于2~16的整数
* * * * *
## 3. 浮点数
1. 整数除法示例: 4 div 2。
2. 求余示例: 5 rem 2。
3. "/"永远返回浮点数。
17. 368 -56. 654 1. 234E-10.
E-10是一种常规的浮点表示符号,用来表示十进制小数点必须向左移动10个位置。1. 234E-10和1.234×10~10是一样的,即0.00000001234。Erlang中的浮点数的精确度
是由IEEE 754-1985标准中的64位表示法来保证的。
一个浮点数有5个部分:一个可选符号位、一个数值部分、一个小数点、一个小数部分以及
一个可选的指数部分。
下面就是一些浮点数的例子:
1.0 3.14159 -2.3e+6 23.56E-27
经过解析,浮点数在内部会以IEEE 754的64 bit格式表示。Erlang可表示的浮点数的范围是
-10 323 -10 308
* * * * *
二进制串/位串
唯一标识符(pid、端口、引用)
Fun函数
=模式匹配
## Atoms(原子)
* Atoms表示不同的非数字常量值。
* 示例: Xss = 'Asss'。
* atom是否已经注册的:registered() unregister(Pid) whereis(Atom) regs().
* atom能够进行的唯一运算就是比较
* atom是可以使用.和@的,但是别给自己添乱
* atom会被记录在ERT系统表中,只需要几个字节,atom之间比较起来也很快
* atom不参与Erlang GC,所以atom不能无节制的创建,list_to_existing_atom可以一定程度上缓解创建重复atom的内存消耗
## 元组
* 将若干个以逗号分隔的值用一对大括号括起来就形成了一个元组。
* 元组示例: Person = {person, {name, joe}, {height, 1.83}, {footsize, 42}}.
* 从元组中提取数据:
```erlang
Point = {point, 10, 45}.
{point, X, Y} = Point.( pattern match)
此后X=10, Y=45.
%%1. record类型作为参数的小技巧
-record(x,{name,zz}).
-record(y,{yy,name}).
-export([test1/0,test2/0]).
-define(create(Type,Name),#Type{name = Name}).
test1() -> ?create(x,"Noel"). % -> {x,"Noel",undefined}
test2() -> ?create(y,"Noel"). % -> {y,undefined,"Noel"}
```
* Tuple是Erlang表达复杂数据结构的手段,第一个元素经常被称作Tag,Tag Massage是Erlang编程的最佳实践
* Tuple索引是从1开始的,执行一下 element(1,{a,b,c}).看看 再试一下element(0,{a,b,c})看看报什么错
* Tuple大小使用tuple_size({1,2,3,4,5}).
## 列表
* 将若干个以逗号分隔的值用一对方括号括起来,就形成了一个列表。
* 示例: ThingsToBuy = [{apple, 10}, {pear, 6}, {milk, 3}].
* 列表中的第一个元素叫做列表头,剩下的部分叫做列表尾。一般来说列表头可以是任何东西,列表尾经常是一个列表。
* 访问列表头元素是一个非常高效的操作。
* 从列表中解析元素:
```erlang
ThingsToBuy1 = [{oranges, 4}, {newspaper, 1}|ThingsToBuy].
[Buy1|ThingsToBuy2] = ThingsToBuy1.
%% 此后:ThingsToBuy1 = [{oranges,4},{newspaper,1},{apple,10},{pear,6},{milk,3}].
Buy1 = {oranges,4}.
ThingsToBuy2 = [{newspaper,1},{apple,10},{pear,6},{milk,3}].
```
* M++N会遍历列表M所以如果必须要使用++也要让数据量小的List在前面
* proplist对于处理key_value的list真的是非常方面
* List=[Element|List]所以你可以在shell中可以输入[1,2|3],尝试匹配一下它 [A,B,C]=[1,2|3]再试一下[P,Q]=[1,2,3]
* List最后一个元素是空列表[],被称作well-formed list正则列表,[1,2|3]这种结构要避免
* --操作符是针对元素进行的 [1,2]--[3]结果是[1,2] [2,2]--[2]结果是[2],运算顺序是从右到左, [1,2,3]--[1,2]--[1].结果是[1,3]
* 在Server中,总是尽力书写尾递归(tail-recursive)的函数
* 使用'++'时,left list会被拷贝,然后添加到right list的头部,因此最好把length较短的list放在左侧
## 字符串
在erlang中没有字符串,字符串仅仅是整数列表。用双引号将一串字符括起来就是一个字符串。
```erlang
Name = "Hello".
5>I = $s.
115
8> [I-32, $u, $r, $p, $r, $i, $s, $e].
"Surprise"
```
* Erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针)。因此string速度较慢,空间占用较大
## map
```erlang
#{a => 1}.
#{a := A} = #{a => 1}.
```
- 1.学习
- 1.1安装与运行环境
- 1.2编辑器、集成开发环境与其它工具
- 1.3代码编译运行
- 2.基础
- 2.1 Erlang终端
- 2.2 基础语法
- 2.2.1 异常处理
- 2.3 数据类型
- 2.4 操作符
- 2.5 模块属性
- 3.库函数
- 3.1 常用模块
- 3.2 OTP模块
- 3.2.1 函数
- 3.2.2 receive
- 3.2.3 .app.src文件
- 3.2.4 _app.erl
- 3.2.5 _sup.erl
- 3.2.6 gen_server
- 3.2.7 gen_fsm
- 3.3 erts
- 3.3.1 init
- 3.3.2 BIF
- 3.3.3 NIF
- 3.4 kernel
- 3.4.1 code_server
- 3.4.2 inet
- 3.4.3 net_kernel
- 3.4.4 net_adm
- 3.4.5 error_logger
- 3.4.6 global
- 3.4.7 application
- 3.5 stdlib
- 3.5.2 array
- 3.5.4 base64
- 3.5.5 binary
- 3.5.6 c
- 3.5.8 calendar
- 3.5.9 code
- 3.5.11 dict
- 3.5.12 erl_
- 3.5.13 file
- 3.5.14 filelib
- 3.5.15 gb_trees
- 3.5.16 gb_sets
- 3.5.17 gen_tcp
- 3.5.18 gen_server
- 3.5.19 httpc
- 3.5.20 init_parse
- 3.5.21 init
- 3.5.22 inet
- 3.5.23 io
- 3.5.24 lists
- 3.5.25 maps
- 3.5.26 os
- 3.5.27 ordsets
- 3.5.28 proplists
- 3.5.29 queue
- 3.5.30 qlc
- 3.5.31 re
- 3.5.32 random
- 3.5.33 rfc4627-json
- 3.5.34 string
- 3.5.35 ssh
- 3.5.36 soft
- 3.5.37 sets
- 3.5.38 supervisor
- 3.5.39 tuple
- 3.5.40 timer
- 3.5.41 unicode
- 3.5.42 cpu
- 3.5.43 math
- 3.5.44 zip
- 3.5.45 shell
- 3.6 SASL
- 3.7 asn1
- 3.8 compiler
- 3.9 tools
- 3.10 OS_Mon
- 3.11 crypto
- 3.12 Port
- 4.工具
- 4.1 Erlang预处理器
- 4.2 Erlang节点
- 4.3 Erlang多节点
- 4.3.1主从节点
- 4.4 Epmd
- 4.5 断点工具
- 4.6 dialyzer
- 4.7 dbg-debug 模块
- 4.7.1 dbg
- 4.8 Erlang跟踪工具
- 4.9 etop
- 4.10 profiling
- 4.10.1 fprof
- 4.10.2 eprof
- 4.10.3 cprof
- 5.进阶
- 5.1 TCP粘包、大小端
- 5.2 rebar发布系统
- 5.3 ErlangVM 心跳
- 5.4 Erlang GC
- 5.5 Erlang Time
- 5.6 Erlang 启动
- 5.6.1 SASL配置
- 5.7 Erlang系统限制
- 6.项目
- 6.1 the_seed
- 6.2 network
- 6.3 parse_tool
- 6.4 cache
- 7.项目研究
- 7.1 Mnesia
- 7.1.1 Mnesia模式
- 7.1.2 Mnesia操作
- 7.1.3 Mnesia增删改查
- 7.1.4 Mnesia过载分析
- 7.1.5 Mnesia高级特性
- 7.1.6 分布式
- 7.1.7 Mnesia表分片
- 7.1.8 Mnesia锁
- 7.1.9 dets
- 7.1.10 ets
- 7.2 Ejabberd
- 7.2.1 mod_echo.erl
- 7.2.2 hooks for module developers
- 7.2.3 Events list
- 7.3 cowboy
- 7.4 rebar
- 7.4.1 rebar Wiki
- 7.4.2 rebar.config.script
- 7.5 RIAK CS
- 7.6 Leofs
- 7.6.1 简介
- 8.资料整理
- 8.1 资料
- 8.1.1 Erlang的调度原理
- 8.1.2 虚拟机代码执行原理
- 8.1.3 SMP
- 8.2 杂记
- 8.2.1 设计