erlang基础
性能
可扩展性
容错性
清晰性
并发程序,并行计算机
编程语言有两种:顺序和并发
并发性由Erlang虚拟机提供,而非操作系统或任何外部库
=操作符
Erlang是一种函数式编程语言,模式匹配操作符,而不是一个赋值操作符 Erlang的变量只能赋值一次,一旦值被绑定,就不能改变 定义X=12改变的是地址X处的内存值
变量和原子语法
Erlang的变量以大写开头 小写字母开头的不是变量,而是符号常量,称为原子(atom)
函数式语言中变量不能改变,命令式语言可以
进程、编译和模块
-module (hello). -export ([start/0]). start() -> io:format("hello world~n"). Erlang内编译 c(hello). hello:start(). halt(). hello.beam hello.erl
Erlang外编译,erlc编译器是Erlang编译的首选方式
erlc hello.erl
erl -noshell -s hello start -s init stop
加载了hello模块并执行hello:start函数,随后执行init:stop函数
Erlang的基本并发单元是进程(Process)
一个进程是一个轻量级的虚拟机,只能通过发送和接受消息来与其他进程通信 要创建一个进程,需要调用spawn,用于进程的代码包含在模块内
-module (afile_server). %%模块 -export ([start/1, loop/1]). %%可调用的函数/参数 start(Dir) -> spawn(afile_server, loop, [Dir]). %%进程 loop(Dir) -> %% 等待指令 receiver {Client, list_dir} -> %% 做点什么 Client ! {self(), file:list_dir(Dir)}; {Client, get_file, File} -> Full = filename:join(Dirm, File), Client ! {self(), file:read_file(Full)}; end, loop(Dir).
Erlang编写无限循环的方法。变量Dir包含了文件服务器当前的工作目录,循环内等待指令,执行后再次调用自身继续下一个指令
Erlang对代码采用了一种所谓“尾部调用”的优化,此函数的运行空间是固定的。
loop函数永远不会返回
Client是发送请求进程的标识符
self(),服务器进程的标识符
模式匹配用于选择消息
在接受消息时运行正确的代码,不用编写任何的if else或者switch
基本概念
1、启动和停止erlang shell
Ctrl + C接a
q(). %%
受控方式停止系统,是init:stop在shell中的别名
2、注释: %
是注释的起点
不能在shell里输入附注,附注指以连字符开头的(-module -export)
Erlang可以用任意长度的整数执行整数运算。整数运算是精确的,不会溢出或者无法用特定字长来表示某个整数。
3、变量
当关联一个值和变量时,就是一种断言。这个变量具有该值,不会改变,不能被赋予其他值。(类似常量)
X=12345. X. X=1234(报错)
X不是一个变量
=
不是赋值,是模式匹配操作符
Erlang的变量是一次性赋值变量。
X出现在不同函数里,X值是不相干的。
f()可以让shell忘记现有的任何绑定。使用这个命令之后,所有变量都会变成未绑定状态。
4、变量绑定和模式匹配
没有副作用意味着可以让程序并行
可以修改的内存区域叫可变状态
Erlang是函数式编程语言,具有不可变状态,没有内存共享,没有锁
Erlang变量是对某个值的引用,用指针代表绑定变量,指向一个包含值的存储区。这个值不能被修改。
5、浮点数
4/2 2.0(浮点数) 5 div 3 1(整数) 5 rem 3 2(整数)余数
6、原子
原子被用于表示常量值
原子是全局性的,不需要宏定义或者包含文件就能实现
原子以小写字母开头,接字母,数字,下划线或@
可以放在单引号内,引号形式可创建大写字母开头或包含数字、字母之外字符的原子
双引号用于给字符串字面量定界(单引号和双引号不能互用)
一个原子的值就是本身
7、元组
创建元组是用{}
括起来,用,分隔。
{joy,18}
Erlang没有类型声明
P={10, 45}
创建一个元组绑定到P变量上
元组可以嵌套
Person={person,{name,joy},{height,1.82}}
元组会在声明时创建,不再使用时销毁。
Erlang使用一个垃圾收集器来回收所有未使用的内存,这样就不必担心内存分配问题
构建元组时使用变量,新的元组会共享变量所引用数据结构的值
不能使用未定义的变量创建元组
提取元组的值
Point = {point, 10, 45}
提取
{point, X, Y} =Point X. 10 Y. 45
等号两侧的元组必须有相同数量的元素
同一模式里的_不必绑定相同的值
Person={person,{name,joy,arm},{footsize,42}} {_,{_,who,_},{_,_}} = Person who. joy
8、列表
列表被用来存放任意数量的事物,用[]
括起来,用逗号分隔
列表的第一个元素成为列表头,剩下的是列表尾
定义列表
[]
空列表,T是一个列表,[H|T]
也是一个列表,都是H,尾是T
ThingsToBuy = [{apples,6},{pear,6},{milk,3}] ThingsToBuy1 = [{orange,1},{newpaper,2}| ThingsToBug] ThingsToBuy1. [{orange,1},{newpaper,2},{apples,6},{pear,6},{milk,3}]
提取列表元素
用模式匹配操作来提取某个列表里的元素
[X|Y] = L
9、字符串
Erlang里没有字符串。
要表示字符串,一个由整数组成的列表或者一个二进制型。
当字符串表示为一个整数列表时,列表里的每个元素都表示一个Unicode代码点
可以用字符串字面量创建一个列表
Name="hello"(必须是双引号)
“hello”是列表的简写,包含了代表字符串里各个字符的整数字符代码。
如果将整数列表打印成整数,使用格式化写语句
X=[97,98,99]. "abc" io:format("~w~n",["abc"]). [97,98,99]