所用书籍:Erlang编程指南,机械工业出版社
第一章:跳过
第2章:Erlang基础
在开始之前要安装一下Erlang, 注意此书中未讲这部分,实际上自己安装一下非常的简单,在windows下面,可以直接去 www.erlang.org 下载windows下的二进制版本,一路next就完成了,在我所用的 Linux Mint 12 下,可以直接使用新得立软件包管理器,搜索Erlang, 并应用,搞定。
整数: -233 0, 2222, 434343434,在erlang里,整数可以无限大,不受32,64等的限制,只要你的内存有多大,就可以有多大的整数。强大了这一点。。。
表示其它的进制:2#1010 相当于十进制的10 (进制#数据),-16#EA表示整数-234, 8#34 就表示8进制的34. 非常强大的表示法。
“$” 表达式,哈哈,这个符号虽然与PHP里面的变量符号相似,但实际上意思是完全不同,它的后面只能跟一个ASCII字符,用来表示求其后所跟的字符的ASCII值,如 $a 表示的是 97, 而$A则表示整数65. $\n的ASCII数值则是10….
数学运算符:
+-*/一样,注意乘法与除法是浮点数的计算方式,结果也是浮点数.
新知识:
div : 整数除法.
rem : 整数取余, 相当于PHP,c++里面的 % , 此操作要求所给出的数是整数, 不可以是浮点数
基元(atom): 相当于其它语言里面的枚举
必须以小写字母开头(注意大写字母开头的是变量)
单引号: 用单引号包围起来的话基元可以是任何字符
布尔:
erlang中没有布尔类型, 基元 true , false 与布尔操作符一起用, 但并不是布尔型
BIF: build in function, 内建函数
is_boolean() 用来判断是否布尔型
逻辑运算符:
and : 两个都为真
andalso : and的快捷方式, 如果第一个为假, 则不判断第二个,
注:这里有疑问,其它语言里面本来 && 就是andalso, 难道erlang里面的and当第一个为假的时候还去判断第二个?
or:
orelse:与and的关系类似, 疑问也类似
xor: 异或
not: 非操作, 注意erlang里面没有 ! 求非符
元组(tuple): 复合数据类型, 用大括号围起来, 可以是基元, 整/浮点数, 其它的元组, 列表
元组的索引是从1开始,而不是PHP和C++里面的0,嗯,从1开始更直观.
BIF: tuple_size, element, setelement
列表(List):
字符串: erlang中没有字符串类型, 字符串是一个由ASCII值组成的整数列表, 比如”I am a String”
实际上就是列表[$I, $ , $a, $m, $ , $a, $ , $S, $t, $r, $i, $n, $g], 空字符串等价于空列表
基元与字符串的区别:
基元只可以用比较操作符.
而字符串可以进行多种不同的方式处理字符串.
基元在系统表中表示,它仅仅占几个字节用作索引,而与它的大小无关
列表的递归定义:
明白一条, 这几个列表都是等价的:
[1,2,3,4] [1,2,3,4|[]] [1,2|[3,4]] [1,2|[3|[4]]]] [1|[2|[3|[4|[]]]]]
列表函数和操作:
这些函数不是内置函数.
lists:max lists:reverse lists:split …
这里面要注意要记住一个 lists:nth 表示获得第i个元素的值
BIF: length
列表运算符: ++ 与 — , 用来表示列表的组合
[1,2] ++ [2, 3, 4] => [1,2,2,3,4]
特别注意: ++与–是右结合, 因此表达式:
[1,2,3] — [1,3] — [1,2]
是等价于
[1,2,3] — ([1,3] — [1,2])
在列表前添加一个元素,可以有两种方法
使用构造方法: [1|[2,3,4]]
使用++运算符: [1] ++ [2,3,4]
结果相同, 但是++运算符效率更低,并可能导致程序运行时速度大幅减慢.
因此当想添加一个列表头部的时候, 应该尽量使用构造器方法.
项元的比较:
注意不等于在erlang里面是 “/=”, 而不是常见的 “!=”, 注意此判断非类型敏感
“=:=” 精确等于
“=/=” 精确不等于
不同类型之间比较的顺序: 记住这个顺序. 或是有个大致印象. 
number < atom < reference < fun < port < pid < tuple < list < binary
列表的比较, 是按字典顺序排.
[boo, hoo] < [adder, zebra, bee]. => false, 比较的时候是按顺序下来.谁先大出,则谁大
元组的比较, 是先比较元素数目,然后再一个个去比较
{boo, hoo} < {adder, zebra, bee}. => true
变量:
所有的函数的变量调用都是按值调用
变量无需申明可以直接使用, 类型无需申明, 是动态类型.
变量必须以大写字母开头, 记住小写开头的是基元.
变量的值只能绑定一次, 绑定以后不可再次绑定.
erlang中的变量没有引用的概念, 因为引用不适合于并行系统.
模式匹配:
Pattern = Expression , 简单来讲, 相当于PHP里面的 list() = array() 的结构.
List = [1,2,3,4]
[Head|Tail] = List.
Head => [1], List => [2,3,4].
通配符”_”: 相当于占位符. 它可以匹配任何东西, 而且不产生任何绑定.
{Element, Two, _} = {1, 1, 2}
_ 与 _var : _从不匹配,只占位, _var 与普通基元是一样的意义, 不同之处是如果这个变量没
有被使用, 则它不会出警告, 而普通的变量如果未被使用, 则会有警告.
函数:
参数数量叫元数(Arity)。
-> : 使用箭头来分隔函数体与申明
; : 用来隔开函数的多种匹配,有点类似于C++的多态,但erlang里面的写法更精简。
, : 用来隔开语句
. : 表示函数的结束。
模块:
一个.erl文件就可以是一个模块。
.erl文件要以 -module(Name) 开头
-export([Functionname/1]): 注意这个格式,表示导出的函数名,此函数所支持的参数个数。
Erlang的编译:
在erl终端下,可以直接输入c(ModuleName)来编译。注意先用cd(“/dir/of/your/path”)进入你的程序目录。
-compile(export_all) : 表示编译时导出所有的函数。
在命令行时可以使用 c(Mod, [export_all]) 来导出所有。
-import(Module, [Function/Arity,...]) : 用来导入外部的函数,就像内部函数一样使用,不需要在前面带上模块名称。
约定:尽量少用导入语句,以免引起代码理解的困难。
第二章习题:
前面几题不需要什么太多记录,重点记录试验一下第2-3.
习题2-3解答,这是我的代码。请保存成mybool.erl文件,再编译。
-module(mybool).
-export([b_not/1]).
-export([b_and/2]).
-export([b_or/2]).
-export([b_nand/2]).
b_not(false) ->
true;
b_not(true) ->
false;
b_not(_Other) ->
error.
b_and(true, true) ->
true;
b_and(_A, _B) ->
false.
b_or(true, _B) ->
true;
b_or(A, B) ->
b_or(B, A).
b_nand(A, B) ->
b_not(b_and(A, B)).
好了,第二章的学习暂时结束,转入下一个章节的学习。