模块 03查看课程目录
00起跑线:两门语言,一台机器01先建立 BEAM 心智模型02Elixir 基础:让数据流过函数03Erlang 基础:读懂 BEAM 的母语04两种语法,一套语义05从裸进程理解并发06从手写循环推导 OTP07监督树与应用08状态、吞吐与背压09分布式与可运维性10Erlang ↔ Elixir 互操作11综合项目:可靠任务调度器
03
语言入门Erlang

Erlang 基础:读懂 BEAM 的母语

变量大小写、句点、分号和逗号,背后都有结构。

5检查点
6 小时预计完成
为什么先学这个

先修正心智模型,再增加 API

只学 Elixir 也能做大量工作,但 Erlang 文档、错误报告与 OTP 原生 API 会一直出现。能读写基础 Erlang,才不会在遇到 `:gen_tcp`、observer 输出或 Erlang 依赖时失去判断力。

学完你能做到

可验证的学习目标

  • 能解释 atom、变量、tuple、list、map 与 binary 的写法
  • 能正确使用逗号、分号和句点组织表达式与函数子句
  • 能创建 Rebar3 项目并用 EUnit 运行测试
前置知识
  • 完成 Elixir 基础
  • 理解模式匹配与递归
最小心智模型

先抓住三个词

01

大写变量

Erlang 中以大写字母或下划线开头的是变量;小写裸词通常是 atom。

02

标点结构

逗号连接顺序表达式,分号分隔函数子句或分支,句点结束一个完整函数定义或 shell 表达式。

03

binary

`<<...>>` 表示二进制。UTF-8 文本通常用 binary;传统 charlist 本质是整数列表。

双语代码桥

先对齐协议,再看标点

Erlang 的模块名是 atom,导出项带元数。列表推导里的模式同时完成筛选与解构。

Elixir
defmodule Orders do
  def total(items) do
    items
    |> Enum.filter(&(&1.status == :paid))
    |> Enum.map(& &1.amount)
    |> Enum.sum()
  end
end
Erlang
-module(orders).
-export([total/1]).

total(Items) ->
  Paid = [Item || Item = #{status := paid} <- Items],
  Amounts = [Amount || #{amount := Amount} <- Paid],
  lists:sum(Amounts).
LAB
可运行实验

三种标点,三种边界

约 15–25 分钟

复制一个两子句函数,然后分别破坏逗号、分号和句点。不要只记报错文字,要指出解析器以为哪一段还没结束。

  1. 01

    创建 `classify/1` 的正数与零/负数两个子句

  2. 02

    把第一子句末尾分号改为句点,编译

  3. 03

    把函数体中的逗号改为分号,再编译

在终端 / shell 中运行
rebar3 eunit
预期观察
  • 分号连接同名同元数的多个子句
  • 句点结束整个函数定义
  • 逗号让同一函数体中的表达式按顺序求值
故意弄坏

删除 `-export([total/1]).` 后,从 shell 调用 `orders:total/1`。模块内部函数仍能存在,但外部入口消失。

这个实验能证明

Erlang 标点表达的是结构边界,而不是可随意替换的风格。

这个实验不能证明

通过编译只说明语法与部分静态约束成立,不说明业务结果正确。

快速自测

Erlang 中 `user_name` 默认是什么?

本章挑战

Erlang 版日志分析器

用 Rebar3 重写上一章项目。保持输入输出协议一致,让同一组 fixture 同时验证两种实现。

提示 1轻推一下

用 binary pattern 拆分级别前缀。

提示 2缩小问题

把 I/O 留在单独模块,核心模块只接收 binary 列表。

提示 3接近实现

EUnit 测试函数可用 `_test` 或 generator 形式。

提示 4用验收标准反推

从下面每一条验收标准倒推一个最小测试。若某条无法写成测试,先把表述改成可观察结果。

完成标准
  • 模块导出最小公开 API
  • binary 与 charlist 的边界被显式处理
  • EUnit 覆盖与 Elixir 版相同的场景
带走这三句话

复习卡

  1. 1Erlang 的语法更直接地暴露模块、元数与 OTP 约定。
  2. 2binary 和 charlist 不是一回事;跨语言边界要主动转换。
  3. 3标点是语法树的边界标记,不只是书写习惯。
继续核对

本章一手资料

Erlang Reference ManualRebar3EUnit