1.erl文件头部
-module(person).
-export([init/1,test/2]). %未在此处被申明的函数不可在模块外部被调用
-import(lists,[map/2,sum/1]). %lists是erlang的标准库,在此导入其中的map和sum两个函数
init(name) ->
test(a,b) ->
-module(person).代表此文件包含用于person的模块代码,与文件名person.erl一致,模块名必须以小写字母开头。
-export是一条导出申明,代表函数init可以在模块外部被进行调用,/1代表带有一个参数
2.变量
X=2
erlang里的变量必须以大写字母开头,并且一旦定义了变量的值,就不能再改变。
定义了X=2之后,再给变量重新赋值X=999,会报错。
3.命令行模式,编译,执行
在命令行的shell里,逐行运行。每行结尾以句号加空白(空格,回车或tab)来结束。
$ erl 启动
c(hello) 编译
hello:start() 执行hello模块下的start函数
halt() 停止
4.除法
使用/来运算时,得到的结果都是浮点数。
4/2 得到结果2.0
5 div 3 得到结果1
5 rem 3 5%3,得到结果2
4 rem 2 得到结果2
5.元组,列表
person = {a,{footsize,45},joe,89}
{A,B,C,D} = person % D被赋值为89
[T|Y] T是列表头,Y是列表尾,[|]这种形式通常写在赋值等式的左边。
T有可能为单个元素或者元组或者一个列表,Y必须为列表
%列表推导式
L = [1,2,3]
[X*2||X <- L] %列表L内的元素依次经过X*2这个函数,得到
[2,4,6]
6.字符串,字符
X = $s % 将s的ASCLII码值赋值给X
% erlang里其实没有严格意义上的字符串,字符串可以看成一个整数列表
% [1,2,3] 如果一个列表里的整数在ASCII码表里无对应,就是他本身
% [1,2,3]
% [83,117] 否则视为一个字符串
% "Su"
Name = "hello" %必须使用双引号来赋值
7.函数
-module(geo).
-export([]).
area({a,Width,Height}) -> Width*Height;
area({b,Side}) -> Side*Side.
case(X,Y,Z) -> %一个函数下有多行语句,每行末尾以,号结束,最后一行以.号结束。
X = 2,
Y = 1,
Z = 3.
这个area函数有两个子句,都只有一个字典作为参数,首句以;隔开,末句以.结尾。
使用geo:area({a,12,3})匹配到第一个子句
使用geo:area({b,3})匹配到第二个语句。
如果使用这样的写法要注意考虑所有的情况(为空等等),如果像for循环的递归,注意要给个出口。
8.for循环
erlang里没有for循环,需要自定义函数来模拟for循环。
for(MAX,MAX,F) -> [F(MAX)];
for(I,MAX,F) -> [F[I]|for(I+1,MAX,F)].
%其中F是一个需要自定义的函数。
for(1,10,fun(X) -> X end) %生成[1,2,3,4,5,6,7,8,9,10]
for(1,10,fun(X) -> X*X end) %生成[1,4,9,16,25,36,49,64,81,100]
9.标准库
erlang里有个标准库lists。
lists中的map函数,让列表里的元素一次迭代,作为参数进入前面的fun中运算,结果写入一个列表。
L = [1,2,3,4]
lists:map(fun(X) -> X*2 end,L)
[2,4,6,8]
10.内置函数
用erlang很难实现或者实现非常低效的操作被封装为内置函数
如list_to_tuple(将列表转为元组),time()(以时分秒返回当前时间)
可以在shell模式下直接调用。
11.关卡
关卡就是when
,可以在支持函数表达式的地方或者函数定义的头部使用它。
max(X,Y) when X > Y,Y > 1 -> X;
max(X,Y) -> Y.
12.if和case语句
if
X>2->
B=2; %这边的条件X>2,Y<9是并列的,所以这里要加个;号
Y<9->
B=3;
true->
B=0 %这是最后一个表达式,末尾不需要加;号
end
%if会在下方列出的所有条件里逐条比对,直到找到符合条件的,执行下方的语句
%如果没有找到符合条件的语句就会报错,所以通常最后一个条件会放一个原子true,保证不报错
```erlang
case P(H) of
1 -> %这边的1,2都是表达式P(H)的运行结果
X=2;
2 ->
X=3
end
其他
判断是否等于 =:=