Erlang入门

慕光赫
2023-12-01

一,启动&退出Erlang Shell

$ erl // 启动

$ halt(). // 退出

二,编译和运行

示例代码:

-module(hello).
-export([start/0]).

start() ->
    io:format("Hello worl~n").

1,在Erlang shell里

$ erl

1> c(hello).

2> hello:start().

2,在系统Shell里

$ erlc hello.erl

$ erl -noshell -s hello start -s init stop

%% -s init stop 表示最后执行 init:stop() 函数。

三,变量/常量(原子)/元组/列表/记录/映射组/字符串/二进制型

1,变量

%%code begin%%

1> Var=1. %% 变量赋值
1
2> Var. %% 打印变量
1

%%code end%%

Erlang中的变量以大写字母开,并且只能一只赋值(模式匹配)。

2,常量(原子)

原子以小写字母开头,后接字母/数字/下划线/at符号(@)

3,元组(类似C里面的struct)

struct point {
    int x;
    int y;
} P;
1> Point = {point,20,25}. %% 创建元组
{point,20,25}
2> {point,X,Y}=Point. %% 提取元组的值到变量X,Y
{point,20,25}
3> X. %% 打印变量X
20
4> Y. %% 打印变量Y
25
1> Pc={{cpu,"intel i7"},{memory,"Kingston 8G"}}. %% 创建元组
{{cpu,"intel i7"},{memory,"Kingston 8G"}}
2> {_,{_,Memory}}=Pc. %% 提取内存型号到变量Memory,其中_(下划线)为匿名变量,可以绑定不同的值。
{{cpu,"intel i7"},{memory,"Kingston 8G"}}
3> Memory.
"Kingston 8G"

4,列表


1> [First,Second|Tail] = [1,2,3,4,5]. %% 提取列表元素
[1,2,3,4,5]
2> First.
1
3> Second.
2
4> Tail.
[3,4,5]

5,记录

%%在文件record.erl中定义一条记录:
-record(book,{name="Homeric Hymns",language="English",pageCount=999}).

%%使用rr(read record)命令读取记录
1> rr("record.erl").
[book]

%%打印记录全部字段信息
2> #book{}.
#book{name = "Homeric Hymns",language = "English", pageCount = 999}

%%实例化记录并修改字段值
3> Ins1 = #book{language="Chinese"}.
#book{name = "Homeric Hymns",language = "Chinese", pageCount = 999}

%%提取多个指定字段值到变量中
4> #book{ name=Name,language=Language } = Ins1.
#book{name = "Homeric Hymns",language = "Chinese", pageCount = 999}
5> Name.
"Homeric Hymns"

%%打印单个指定字段
6> Ins1#book.language.
"Chinese"

%%使用rf(record forget)命令忘掉book的定义
7> rf(book).
ok
8> Ins1.
{book,"Homeric Hymns","Chinese",999}
%%记录其实就是给每个元素指定名称的元组。

6,映射组

%%新建映射组
1> M1 = #{ a=>1 ,b=>2 }
#{a => 1,b => 2}

%%基于已有的映射组修改/创建一个新的的映射组

%%增加键值
2> M2 = M1#{ c=>3 }.
#{a => 1,b => 2,c => 3}

%%修改键值
3> M3 = M1#{b=>22}.
#{a => 1,b => 22}

%%用 := 增加键值,则会报错。:=仅用于已存在的键名,=>可用于不存在的键名,如果键名不存在,则创建一个。
4> M4 = M1#{c:=3}.
exception error: {badkey,c}
     in function  maps:update/3
        called as maps:update(c,3,#{a => 1,b => 2})
     in call from erl_eval:'-expr/5-fun-0-'/2 (erl_eval.
     in call from lists:foldl/3 (lists.erl, line 1262)

%%用 := 修改键值
5> M5 = M1#{ b:=22 }.
#{a => 1,b => 22}

7,字符串


1> X="Hello!". %% 字符串必须用双线号
"Hello!"
2> X.
"Hello!"
3> f(). %% 清空当前Shell绑定的变量
ok
4> X.
* 1: variable 'X' is unbound

8,二进制型和位语法

10> A = 1.
1
11> B = 2.
2
12> C = 3.
3
13> <<A:8,B:16,C:8>>.
<<1,0,2,3>>
14> <<A:2,B:2,C:4>>.
<<"c">>

十进制/二进制对应
1 => 1
2 => 10
3 => 11

Line13:
A:8表示取8位,不够补0,也就是00000001
B:16表示取16位,也就是 00000000 00000010
C:8表示取8位,也就是 00000011
8位一字节,转换成十进制分别是1,0,2,3,对应的Ascii码是不可打印字符

Line14:
01100011 转换成十进制是99,对应的Ascii码是字符c
如果某个二进制型的内容是可打印字符,Shell就会将这个二进制型打印成字符串,否则就打印成一列整数。

四,函数


-module(geometry). %% 几何模块
-export([area/1]).

area({rectangle,Width,Height}) ->
    Width * Height;
area({square,Side}) ->
    Side * Side.

1> geometry:area({rectangle,10,20}). %% 计算矩形面积
200
2> geometry:area({square,5}). %% 计算正方形面积
25

注:函数的返回值为最后一条语句的值。

几个常用的函数
pwd() 打印当前工作目录
ls() 列出当前目录所有文件
cd(Dir) 修改当前工作目录

 类似资料: