Wiki
Clone wikiErlang 语言学习笔记 / Home
Erlng
Erlang 编程语言
Erlang Shell
Erlang Shell 命令是 erl 。命令以 . 和回车结束。
可以用 ctrl + c 然后选 a 退出 或 执行 halt(). 或 q(). 退出。建议使用 q(). 命令 ,q() 命令会按正确的顺序的关闭系统,halt().命令会强制性的关闭系统,可能会损坏数据库。
f() 会让shell释放它所绑定过的所有变量。执行过这个命令后,所有的变量都变成自由变量。
Erlang R15B (erts-5.9) [smp:2:2] [async-threads:0]
Eshell V5.9 (abort with ^G)
1> 1+4.
5
2>
编译运行 Erlang 代码
文件 tut.erl 需要保存到 erl 程序目录。
-module(tut1).
-export([fac/1]).
fac(1) ->
1;
fac(N) ->
N * fac(N - 1).
在 erlang shell 里执行下面的代码编译程序。
3> c(tut1).
{ok,tut1}
然后执行下面的代码执行
4> tut1:fac(4).
24
erlang 文件加载器搜索路径
code:get_path()
获得加载器搜索路径列表
code:add_patha(dir)
将新的路径增加到路径列表开头。
code:add_pathz(dir)
将新的路径增加到路径列表结尾。
code:all_loaded()
获得已加载的模块的列表。
当前目录的问题
3> pwd().
/home/a/s/gamexg/myerl
ok
4> cd("/home/a/s/gamexg/myerl")
erl -pa Dir1 -pa Dir2 -pz Dirz1 -pz Dirz2
上面的命令可以在启动erl时配置文件加载器路径。 pa 增加到列表开头,pz 增加到列表结尾。
数据类型
内置函数参考(类型转换): http://www.erlang.org/doc/man/erlang.html#integer_to_list-2
变量
所有的变量以大写字母开头,变量只能执行一次赋值操作,既变量不变。
原子
原子是一串一小写字母开头,后跟数字、下划线(_)、@的字符。使用单引号引起来的字符也是原子。erlang 内原子一经创建就不会回收,而默认原子限制为 1048576 个,超过的话erl 就会挂掉。所以创建原子要注意。
原子相关的函数有 atom_to_binary/2 binary_to_atom/1 binary_to_existing_atom/1 atom_to_list/1, list_to_atom/1, list_to_existing_atom/1 等函数。
http://www.erlang.org/doc/man/erlang.html#atom_to_binary-2
元组
将若干个以逗号分割的值用一对花括号括起来就形成了一个元组。元组类似于c语言中的结构。建议元组的第一个元素用一个原子来标明这个元组所代表的含义(C语言中的结构名)。
Eshell V5.9 (abort with ^G)
1> P = {point,10,45}.
{point,10,45}
2> {point,X,_} = P.
{point,10,45}
3> X.
10
4>
记录
-record(Name, {
key1 = Default1,
key2 = Default2,
key3
}
).
记录名和字段名必须是原子。记录的定义可以包含在源代码里面或.hrl文件里。但是不能用record命令直接在shell里定义,可以用rr命令载入hrl文件。使用rf命令释放记录定义。
1> rr("aaa.hrl").
[Name]
创建并操纵记录
2>X=#Name{}.
#Name{key1 = Default1,key2 = Default2,key3=undefined}
3>X1=#Name{key1=123,key3=789}.
#Name{key1 = 123,key2 = Default2,key3=789}
4>X2=X1#Name{key2=456}.
#Name{key1 = 123,key2 = 456,key3=789}
5>#Name{key1=AAA}=X2.
#Name{key1 = 123,key2 = 456,key3=789}
6>AAA.
456
7>X2#Name.key1.
123
8>rf(Name).
ok
3>X2.
{name,123,456,789}
记录就是元组,系统内部只有元组,记录只是语法层的快捷方式而已。
列表
列表用来储存数目可变的东西,将若干以逗号分割的值用一对方括号括起来,就形成了一个列表。
1> L = [1,2,3,4,5,6,7,8,9].
[1,2,3,4,5,6,7,8,9]
2> [X|Y]=L.
[1,2,3,4,5,6,7,8,9]
3> X.
1
4> Y.
[2,3,4,5,6,7,8,9]
5>
参考:http://svn.liancheng.info/cpie-cn/trunk/.build/html/part-i/chapter-3.html
字符串
Erlang 里面的字符串实际上是整数列表。用双引号将一串字符括起来就是一个字符串。shell 打印一串列表值时,只有列表中所有的整数都是可打印字符时才会当做字符串来打印。可以用 $符号来表示字符的整数值,例如,$a 实际上是一个整数,表示字符a。
语法
函数
函数1(参数1, 参数2) when 断言1, 断言2 ->
函数内容1,
函数内容2;
函数1(参数1) when 断言1 - >
函数1内容.
相同函数名不同参数的函数需要写在一起之间用分号分开。不同函数名的函数直接用句号(.)结束。函数内部使用逗号(,)来分割语句。
If 语句
if
条件1 ->
动作1;
条件2 ->
动作 2;
条件 3 ->
动作 3
end
注意:在结尾没有分号(;)。条件部分可以存放多个条件,以逗号(,)表示 AND ,以分号(;)表示 OR。
Case 语句
-module(tut10).
-export([convert_length/1]).
convert_length(Length) ->
case Length of
{centimeter, X} ->
{inch, X / 2.54};
{inch, Y} ->
{centimeter, Y * 2.54}
end.
71> c(tut10).
{ok,tut10}
72> tut10:convert_length({inch, 6}).
fun 匿名函数
Eshell V5.5.5 (abort with ^G) 1> Z=fun({2,X})->2*X ; 1> ({4,X})->4*X 1> end.
- Fun<erl_eval.6.49591080> 2> Z({2,2}). 4 3> Z({4,2}). 8 4>
宏
系统预定义的宏:
- ?MODULE 表示当前模块名
- ?MODULE_STRING 同上,但是以字符串形式
- ?FILE 当前模块的文件名
- ?LINE 调用的当前代码行数
- ?MACHINE 机器名
Updated