参考文章:
初识Erlang
- 下载自己需要平台的Erlang版本,http://www.erlang.org/download.html
- 对应Windows平台,点击otp_win32/64_VERSION.exe,一步一步安装
- 安装完之后,把安装目录的bin的路径 (比如: D:\Program Files\erl5.9.1\bin) 加到PATH变量中
- 启动bin目录下的werl.exe,或者在命令行输入erl,启动Erlang Shell的一个虚拟器,得到相关提示:“Eshell V5.9.1 (abort with ^G)”
- Erlang Shell 里只能对 Erlang 表达式求值
- 1>: 说明这是要输入的第一个命令
- %: 后面跟着的是注释文字,编译器会忽略
- 20+30.: 求表达式20+30的值,".+回车"表示一个完整命令的结束
- 退出:Ctrl+C 或者 q(). 或者 halt().
- Erlang Shell 里只能对 Erlang 表达式求值
简单入门
- Erlang遵守标准算术表达式法则
- 例如: 20+30*40.
- 结果: 1220
- 变量
- 例如:
- X = 1111.
- X. 得到 1111
- 再次执行: X = 2222. 将得到提示 "** exception error: no match of right hand side value 2222"
- X不是传统意义上的变量,Erlang中变量的值只能一次性给定
- 在Erlang中,=表示一个模式匹配操作。Lhs=Rhs实际上是这样一个过程,对右端求值(Rhs),然后将结果与左端(Lhs)进行模式匹配。
- 一个变量如果含有一个被赋予的值,它就被称为绑定变量,否则就是自由变量
- 一个变量,比如X,就是一个最简单的模式,当我们第一次输入X=something时,Erlang会问自己,“要怎么做会让这个语句的值变为true?”,由于X没有被赋值,于是将something的结果绑定到X上,使语句有效,结果皆大欢喜。
- 但是,随后输入X=anotherthing的时候,由于X已经是绑定变量了,只有当something的值与anotherthing一致时这个语句才会成立,否则就会抛出异常。
- Erlang里面的变量仅仅是对值的一个引用
- f(). : 释放所有绑定的变量.
- 例如:
- 浮点数
- "/": 永远返回浮点数
- "div": 整除
- "rem": 取余
- 5/3. 得到 1.6666666666666667
- 4/2. 得到 2.0
- 5 div 3. 得到 1
- 4 div 2. 得到 2
- 5 rem 3. 得到 2
- 原子
- 在Erlang中,原子用来表示不同的非数字常量值。
- 类似于C中的:#define OP_READ 1 这种宏定义。
- Erlang中的原子是全局有效的,而且无需使用宏定义或者包含文件。
- 原子是一串以小写字母开头,后跟数字、字母或者下划线(_)或者邮件符号(@)的字符,
- 例如monday、abc_d、aaa@somehost等。
- 使用单引号引起来的字符也是原子,使用这种形式,我们就能使得原子可以用大写字母作为开头或者包含非数字字符,
- 例如‘+’、‘a b c’等。
- 一个原子的值就是原子自身。
- 讨论原子或者整数的值听上去多少有些奇怪,但是因为Erlang是个函数式语言,每一个表达式都必须有值,整数和原子这些特别简单的表达式也不例外。
- 在Erlang中,原子用来表示不同的非数字常量值。
- 元祖
- 你若想将一定数量的项组成单一的实体,那么就可以使用元组(tuple)。将若干个以逗号分隔的值,用一对花括号括起来,就形成了一个元组。
- 例如一个叫joe的人身高1米8,那么用元组就可以表示为 { joe, 180 }。
- 例如一个叫joe的人身高1米8,那么用元组就可以表示为 { joe, 180 }。
- 但是在Erlang中没有类型声明,因此创建一个point会是这个样子:P = {10, 20}.
- 为了方便记忆可以给元组添加一个原子作为其第一个元素,来标记这个元组的含义,因此我们可以采用 { point, 10, 45 } 来代替上面的元组,这样更清晰。
- 创建元祖
- 在声明元组时就自动创建了元组,不再使用它们时,元组也随之销毁,Erlang使用垃圾收集器去收回没有使用的内存
- 元祖嵌套
- Person = {person, {name, joe}, {height, 1.82}}.
- F = {firstname, joe}.
- L = {lastname, armstrong}.
- P = {person, F, L}.
- 在声明元组时就自动创建了元组,不再使用它们时,元组也随之销毁,Erlang使用垃圾收集器去收回没有使用的内存
- 从元祖中提取字段
- 回到之前元祖表示点的例子: Point = {point, 10, 20}.
- {point, X, Y} = Point. 或则 {_, X, Y} = Point. % '_'成为匿名变量
- X, Y 就获得坐标的值
- 回到之前元祖表示点的例子: Point = {point, 10, 20}.
- 你若想将一定数量的项组成单一的实体,那么就可以使用元组(tuple)。将若干个以逗号分隔的值,用一对花括号括起来,就形成了一个元组。
- 列表
- 将若干以逗号分隔的值,用一对方括号括起来,就形成了一个列表。例如:
- ThingsToBuy = [{apples, 10}, {pears, 6}, {oranges, 3}].
- 元素类型也可以 不同 XYZ = [1+7, hello, {cost, apple, 30-20}, 0.5].
- 俗语:列表的第一个元素称为列表的头(head),那么剩下的,就称为列表的尾(tail)。列表的头可以是任何东西,但是列表的尾还是一个列表。
- 定义列表:
- 如果T是一个列表,那么 [ H | T ] 也是一个列表,这个列表以H为头,以T为尾。[]表示空列表
- 可以用 [ E1, E2, …, En | T ] 这种形式向T的起始处加入多个新元素,例如
- ThingsToBuy1 = [{newspaper, 1}, {banana, 5} | ThingsToBuy].
- 从列表总提取元祖
- [Buy1 | ThingsToBuy2] =ThingsToBuy1.
- Buy1 的值就是 {newspaper, 1}, ThingsToBuy2 的值就是后面点元祖组成的列表。
- Buy1 的值就是 {newspaper, 1}, ThingsToBuy2 的值就是后面点元祖组成的列表。
- [Buy1 | ThingsToBuy2] =ThingsToBuy1.
- 将若干以逗号分隔的值,用一对方括号括起来,就形成了一个列表。例如:
- 字符串
- 严格来讲,Erlang没有字符串,字符串实际上就是一个整数列表。
- Name = "god".
- [103, 111, 100]. 打印得到 "god" % 只有当列表中的所有整数都是可打印的字符,它才将这个列表当做字符串来打印
- 字符串中的字符是Latin-1
- 严格来讲,Erlang没有字符串,字符串实际上就是一个整数列表。
- 模式匹配