Erlang语法基础 #
一、注释 #
1.1 单行注释 #
Erlang只支持单行注释,以 % 开头:
erlang
-module(comments).
-export([func/1]).
func(X) ->
X + 1.
1.2 注释规范 #
erlang
-module(comment_style).
-export([process/1]).
process(Data) ->
Result = transform(Data),
Result.
transform(Data) ->
Data.
1.3 文档注释 #
erlang
-module(doc_comments).
-export([add/2]).
add(A, B) ->
A + B.
二、标识符 #
2.1 变量 #
Erlang变量规则:
- 必须以大写字母或下划线开头
- 只能赋值一次(单次赋值)
- 以下划线开头的变量表示"不使用"
erlang
-module(variables).
-export([demo/0]).
demo() ->
Name = "Erlang",
io:format("Hello, ~s~n", [Name]),
_Unused = 42,
ok.
变量命名示例:
erlang
ValidName = 1,
AnotherValid = 2,
_private = 3,
_Private = 4,
2.2 原子 #
原子规则:
- 必须以小写字母开头
- 或用单引号包围
erlang
-module(atoms).
-export([demo/0]).
demo() ->
ok,
error,
'Hello World',
'with-hyphen',
'with space',
ok.
原子命名示例:
erlang
ok,
error,
undefined,
'Bad Request',
'Content-Type',
2.3 模块名 #
模块名是原子,通常使用小写字母:
erlang
-module(my_module).
-module('MyModule').
2.4 函数名 #
函数名是原子,使用小写字母:
erlang
func() -> ok.
my_function() -> ok.
三、关键字 #
3.1 保留字 #
以下是Erlang的保留关键字:
| 关键字 | 用途 |
|---|---|
after |
receive超时 |
and |
逻辑与 |
andalso |
短路逻辑与 |
band |
位与 |
begin |
块表达式 |
bnot |
位非 |
bor |
位或 |
bsl |
左移 |
bsr |
右移 |
bxor |
位异或 |
case |
case表达式 |
catch |
捕获异常 |
cond |
条件表达式(已弃用) |
div |
整数除法 |
end |
结束块 |
fun |
匿名函数 |
if |
if表达式 |
let |
let表达式(已弃用) |
not |
逻辑非 |
of |
case分支 |
or |
逻辑或 |
orelse |
短路逻辑或 |
query |
已弃用 |
receive |
接收消息 |
rem |
取余 |
try |
异常处理 |
when |
守卫条件 |
xor |
逻辑异或 |
3.2 使用示例 #
erlang
-module(keywords).
-export([demo/1]).
demo(X) ->
case X of
0 -> zero;
N when N > 0 -> positive;
_ -> negative
end.
四、运算符 #
4.1 算术运算符 #
erlang
-module(arithmetic).
-export([demo/0]).
demo() ->
A = 10 + 5,
B = 10 - 5,
C = 10 * 5,
D = 10 / 5,
E = 10 div 3,
F = 10 rem 3,
io:format("~p ~p ~p ~p ~p ~p~n", [A, B, C, D, E, F]).
| 运算符 | 说明 | 示例 |
|---|---|---|
+ |
加法 | 5 + 3 → 8 |
- |
减法 | 5 - 3 → 2 |
* |
乘法 | 5 * 3 → 15 |
/ |
浮点除法 | 5 / 2 → 2.5 |
div |
整数除法 | 5 div 2 → 2 |
rem |
取余 | 5 rem 2 → 1 |
4.2 比较运算符 #
erlang
-module(comparison).
-export([demo/0]).
demo() ->
true = 1 == 1,
false = 1 == 2,
true = 1 /= 2,
true = 1 < 2,
true = 1 =< 2,
true = 2 > 1,
true = 2 >= 1,
true = 1 =:= 1,
false = 1 =:= 1.0,
false = 1 =/= 1,
true = 1 =/= 1.0,
ok.
| 运算符 | 说明 | 示例 |
|---|---|---|
== |
相等 | 1 == 1 → true |
/= |
不相等 | 1 /= 2 → true |
=< |
小于等于 | 1 =< 2 → true |
< |
小于 | 1 < 2 → true |
> |
大于 | 2 > 1 → true |
>= |
大于等于 | 2 >= 1 → true |
=:= |
精确相等 | 1 =:= 1 → true |
=/= |
精确不等 | 1 =/= 1.0 → true |
4.3 逻辑运算符 #
erlang
-module(logical).
-export([demo/0]).
demo() ->
true = true and true,
false = true and false,
true = true or false,
false = false or false,
false = not true,
true = true xor false,
true = true andalso true,
true = true orelse false,
ok.
| 运算符 | 说明 | 示例 |
|---|---|---|
and |
逻辑与 | true and false → false |
or |
逻辑或 | true or false → true |
not |
逻辑非 | not true → false |
xor |
逻辑异或 | true xor false → true |
andalso |
短路与 | false andalso error → false |
orelse |
短路或 | true orelse error → true |
4.4 位运算符 #
erlang
-module(bitwise).
-export([demo/0]).
demo() ->
16#0F = 16#FF band 16#0F,
16#FF = 16#F0 bor 16#0F,
16#F0 = 16#FF bxor 16#0F,
16#F0 = bnot 16#0F,
16#F0 = 16#0F bsl 4,
16#0F = 16#F0 bsr 4,
ok.
| 运算符 | 说明 | 示例 |
|---|---|---|
band |
位与 | 15 band 3 → 3 |
bor |
位或 | 8 bor 4 → 12 |
bxor |
位异或 | 15 bxor 3 → 12 |
bnot |
位非 | bnot 15 → -16 |
bsl |
左移 | 1 bsl 4 → 16 |
bsr |
右移 | 16 bsr 4 → 1 |
4.5 列表运算符 #
erlang
-module(list_ops).
-export([demo/0]).
demo() ->
[1, 2, 3, 4, 5] = [1, 2, 3] ++ [4, 5],
[1, 2, 3] = [1, 2, 3, 4, 5] -- [4, 5],
[H | T] = [1, 2, 3],
1 = H,
[2, 3] = T,
ok.
| 运算符 | 说明 | 示例 |
|---|---|---|
++ |
列表连接 | [1] ++ [2] → [1, 2] |
-- |
列表减法 | [1, 2, 3] -- [2] → [1, 3] |
| ` | ` | 列表构造 |
五、表达式 #
5.1 块表达式 #
erlang
-module(block_expr).
-export([demo/0]).
demo() ->
Result = begin
A = 1,
B = 2,
A + B
end,
Result.
5.2 if表达式 #
erlang
-module(if_expr).
-export([classify/1]).
classify(N) ->
if
N > 0 -> positive;
N < 0 -> negative;
true -> zero
end.
5.3 case表达式 #
erlang
-module(case_expr).
-export([classify/1]).
classify({point, X, Y}) ->
if
X > 0, Y > 0 -> first_quadrant;
X < 0, Y > 0 -> second_quadrant;
X < 0, Y < 0 -> third_quadrant;
X > 0, Y < 0 -> fourth_quadrant;
true -> on_axis
end.
5.4 fun表达式 #
erlang
-module(fun_expr).
-export([demo/0]).
demo() ->
Add = fun(A, B) -> A + B end,
3 = Add(1, 2),
Double = fun(X) -> X * 2 end,
4 = Double(2),
ok.
六、模式匹配 #
6.1 基本匹配 #
erlang
-module(pattern_match).
-export([demo/0]).
demo() ->
{A, B} = {1, 2},
[H | T] = [1, 2, 3],
{point, X, Y} = {point, 10, 20},
io:format("A=~p, B=~p~n", [A, B]),
io:format("H=~p, T=~p~n", [H, T]),
io:format("X=~p, Y=~p~n", [X, Y]),
ok.
6.2 匹配操作符 #
erlang
-module(match_operator).
-export([demo/0]).
demo() ->
{ok, Value} = {ok, 42},
42 = Value,
ok.
6.3 忽略匹配 #
erlang
-module(ignore_match).
-export([first/1, second/1]).
first({_, B}) -> B.
second({A, _}) -> A.
七、守卫 #
7.1 守卫表达式 #
erlang
-module(guards).
-export([classify/1, max/2, valid_age/1]).
classify(N) when N > 0 -> positive;
classify(N) when N < 0 -> negative;
classify(0) -> zero.
max(A, B) when A > B -> A;
max(_, B) -> B.
valid_age(Age) when Age >= 0, Age =< 150 -> true;
valid_age(_) -> false.
7.2 守卫序列 #
erlang
-module(guard_seq).
-export([demo/1]).
demo(N) when N > 0, N < 10 -> small;
demo(N) when N >= 10, N < 100 -> medium;
demo(N) when N >= 100 -> large.
7.3 守卫中的允许函数 #
守卫中只能使用特定函数:
erlang
-module(guard_funcs).
-export([demo/1]).
demo(X) when is_integer(X) -> integer;
demo(X) when is_float(X) -> float;
demo(X) when is_list(X) -> list;
demo(X) when is_tuple(X) -> tuple;
demo(_) -> other.
允许的函数:
- 类型检测函数:
is_atom/1,is_integer/1,is_list/1等 - 比较函数:
=:=,=/=,<,>,=<,>= - 算术函数:
+,-,*,div,rem - 位运算:
band,bor,bnot,bsl,bsr - 其他:
abs/1,length/1,hd/1,tl/1,element/2等
八、代码规范 #
8.1 命名规范 #
erlang
-module(naming_conventions).
-export([public_function/1]).
-define(CONSTANT, 42).
-define(MACRO(X), X + 1).
-record(user, {id, name, email}).
public_function(VariableName) ->
_UnusedVariable = 1,
LocalVariable = 2,
LocalVariable.
private_function(_Arg) ->
ok.
规范:
- 变量:驼峰命名
VariableName - 函数:下划线分隔
function_name - 原子:下划线分隔
atom_name - 宏:全大写
CONSTANT - 记录:小写
record_name
8.2 缩进规范 #
erlang
-module(indent_style).
-export([process/1]).
process({type_a, Data}) ->
Result = transform_a(Data),
{ok, Result};
process({type_b, Data}) ->
Result = transform_b(Data),
{ok, Result};
process(Other) ->
{error, {unknown_type, Other}}.
transform_a(Data) ->
case Data of
{value, V} -> V * 2;
_ -> 0
end.
transform_b(Data) ->
if
Data > 0 -> Data;
true -> 0
end.
8.3 行长度 #
建议每行不超过80-100字符:
erlang
long_function(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) ->
Result = some_long_calculation(
Arg1,
Arg2,
Arg3,
Arg4,
Arg5,
Arg6
),
Result.
8.4 函数子句格式 #
erlang
function_clause(Pattern1) ->
Body1;
function_clause(Pattern2) ->
Body2;
function_clause(Pattern3) ->
Body3.
九、总结 #
本章学习了:
- 注释语法
- 标识符命名规则
- 关键字
- 各种运算符
- 表达式
- 模式匹配基础
- 守卫表达式
- 代码规范
准备好学习Erlang数据类型了吗?让我们进入下一章。
最后更新:2026-03-27