模块 03查看课程目录
03
语言入门Erlang
Erlang 基础:读懂 BEAM 的母语
变量大小写、句点、分号和逗号,背后都有结构。
5检查点
6 小时预计完成
为什么先学这个
先修正心智模型,再增加 API
只学 Elixir 也能做大量工作,但 Erlang 文档、错误报告与 OTP 原生 API 会一直出现。能读写基础 Erlang,才不会在遇到 `:gen_tcp`、observer 输出或 Erlang 依赖时失去判断力。
学完你能做到
可验证的学习目标
- 能解释 atom、变量、tuple、list、map 与 binary 的写法
- 能正确使用逗号、分号和句点组织表达式与函数子句
- 能创建 Rebar3 项目并用 EUnit 运行测试
前置知识
- 完成 Elixir 基础
- 理解模式匹配与递归
最小心智模型
先抓住三个词
大写变量
Erlang 中以大写字母或下划线开头的是变量;小写裸词通常是 atom。
标点结构
逗号连接顺序表达式,分号分隔函数子句或分支,句点结束一个完整函数定义或 shell 表达式。
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
endErlang
-module(orders).
-export([total/1]).
total(Items) ->
Paid = [Item || Item = #{status := paid} <- Items],
Amounts = [Amount || #{amount := Amount} <- Paid],
lists:sum(Amounts).LAB
约 15–25 分钟可运行实验
三种标点,三种边界
复制一个两子句函数,然后分别破坏逗号、分号和句点。不要只记报错文字,要指出解析器以为哪一段还没结束。
- 01
创建 `classify/1` 的正数与零/负数两个子句
- 02
把第一子句末尾分号改为句点,编译
- 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 版相同的场景
带走这三句话
复习卡
- 1Erlang 的语法更直接地暴露模块、元数与 OTP 约定。
- 2binary 和 charlist 不是一回事;跨语言边界要主动转换。
- 3标点是语法树的边界标记,不只是书写习惯。
继续核对