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 + 38
- 减法 5 - 32
* 乘法 5 * 315
/ 浮点除法 5 / 22.5
div 整数除法 5 div 22
rem 取余 5 rem 21

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 == 1true
/= 不相等 1 /= 2true
=< 小于等于 1 =< 2true
< 小于 1 < 2true
> 大于 2 > 1true
>= 大于等于 2 >= 1true
=:= 精确相等 1 =:= 1true
=/= 精确不等 1 =/= 1.0true

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 falsefalse
or 逻辑或 true or falsetrue
not 逻辑非 not truefalse
xor 逻辑异或 true xor falsetrue
andalso 短路与 false andalso errorfalse
orelse 短路或 true orelse errortrue

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 33
bor 位或 8 bor 412
bxor 位异或 15 bxor 312
bnot 位非 bnot 15-16
bsl 左移 1 bsl 416
bsr 右移 16 bsr 41

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