Wiki

Clone wiki

Erlang 语言学习笔记 / Home

Erlng

Erlang 编程语言

Mnesia 数据库

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.

  1. Fun<erl_eval.6.49591080> 2> Z({2,2}). 4 3> Z({4,2}). 8 4>

系统预定义的宏:

  • ?MODULE 表示当前模块名
  • ?MODULE_STRING 同上,但是以字符串形式
  • ?FILE 当前模块的文件名
  • ?LINE 调用的当前代码行数
  • ?MACHINE 机器名

Updated