首页/关键字字典
ELIXIR + ERLANG LEXICON

别猜它是不是关键字,查清它是什么。

两门语言的严格保留字完整收录,并把特殊形式、宏、模块属性和 预处理指令分开解释。搜英文,也可以直接搜“短路”“模式匹配” “异常”这样的中文概念。

可搜索字典

从词法边界开始查

默认只看严格保留字。需要找 defmodulewith-module 时,切换到对应补充分类。

语言

找到 44

点击上方分类,切换术语的真实语言层级

Elixir

15 个严格保留字,以及常用特殊形式和 Kernel 宏

15
after严格保留字收尾或超时子句

声明 try 的清理逻辑,或 receive 的超时分支。

在 try 中,after 里的代码无论成功或失败都会执行;在 receive 中,它为等待消息设置超时结果。

try do
  work()
after
  cleanup()
end
and严格保留字严格布尔运算符

仅接受布尔值,并且短路计算逻辑与。

左侧必须是 true 或 false;左侧为 false 时不会计算右侧。若要使用真值语义,可用 &&。

ready? and enabled?
catch严格保留字捕获子句

在 try 中捕获 throw、exit 等非异常信号。

普通异常通常交给 rescue;catch 更适合处理 throw/1、进程退出和底层错误类别。

try do
  throw(:stop)
catch
  :throw, reason -> reason
end
do严格保留字代码块起点

引入宏、函数或控制结构的主体。

既可写成 do ... end 多行块,也可写成 do: expression 关键字参数形式。

if ready?, do: run()
else严格保留字备选子句

描述条件不满足或匹配链失败后的分支。

常见于 if、unless、with 和 try;它的具体匹配规则由所在构造决定。

if ok?, do: :yes, else: :no
end严格保留字代码块终点

结束由 do、fn 等开启的块。

Elixir 不依赖缩进闭合语法块;多行块必须使用 end 明确结束。

if ready? do
  run()
end
false严格保留字布尔字面量

表示布尔假值。

在 Elixir 的条件判断中,false 与 nil 是仅有的两个假值,其余值均为真值。

active? = false
fn严格保留字匿名函数

创建可赋值、传递和调用的匿名函数。

匿名函数可以包含多个模式匹配子句,调用时需在变量名后使用点号。

double = fn x -> x * 2 end
double.(3)
in严格保留字成员关系运算符

检查左侧值是否属于右侧集合。

常用于列表或范围成员检查,也可用于 guard;推导式中的生成器使用的是 <-,不要混为一谈。

2 in 1..3
nil严格保留字空值字面量

表示没有值,并在条件中视为假。

nil 是原子 :nil 的字面写法,常作为未找到或可选结果的空值。

result = nil
not严格保留字严格布尔运算符

对布尔值取反。

操作数必须是 true 或 false;若要使用真值语义取反,可使用 !。

not finished?
or严格保留字严格布尔运算符

仅接受布尔值,并且短路计算逻辑或。

左侧必须是 true 或 false;左侧为 true 时不会计算右侧。真值语义版本是 ||。

cached? or fetch?()
rescue严格保留字异常子句

在 try 中匹配并处理异常。

可匹配指定异常结构,例如 ArgumentError;未匹配的异常仍会向外传播。

try do
  risky()
rescue
  ArgumentError -> :invalid
end
true严格保留字布尔字面量

表示布尔真值。

true 是原子 :true 的字面写法,常用作条件结果或 cond 的兜底条件。

enabled? = true
when严格保留字守卫子句

为模式匹配增加守卫条件。

守卫只能调用允许在 guard 中使用的运算符和函数,并在模式匹配之后进行检查。

def positive?(n) when n > 0, do: true

Erlang

29 个严格保留字,以及常见模块属性与预处理指令

29
after严格保留字超时或收尾子句

为 receive 设置超时,或为 try 提供清理阶段。

receive after 可避免永久等待消息;try after 中的表达式会在离开 try 前执行。

receive
  Msg -> Msg
after 1000 ->
  timeout
end
and严格保留字严格布尔运算符

计算两侧后执行布尔逻辑与。

两侧都必须是布尔值,而且不会短路;需要短路时使用 andalso。

true and false. % false
andalso严格保留字短路布尔运算符

左侧为 true 时才计算右侧。

它适合把前置检查与后续表达式串联,避免不必要或不安全的右侧计算。

N > 0 andalso N rem 2 =:= 0.
band严格保留字位运算符

对整数逐位执行与运算。

常用于掩码、标志位和二进制协议字段处理。

6 band 3. % 2
begin严格保留字表达式块

把多个表达式组合成一个表达式。

表达式按顺序执行,以逗号分隔,整个 begin ... end 的值是最后一个表达式的值。

begin A = 1, A + 1 end.
bnot严格保留字位运算符

对整数的每一位执行按位取反。

Erlang 整数精度不受固定位宽限制,因此结果遵循无限精度整数语义。

bnot 0. % -1
bor严格保留字位运算符

对整数逐位执行或运算。

常用于合并多个独立的位标志。

4 bor 1. % 5
bsl严格保留字位移运算符

把整数的位向左移动指定数量。

正数位移通常等价于乘以 2 的相应幂。

3 bsl 2. % 12
bsr严格保留字位移运算符

把整数的位向右移动指定数量。

对负数执行算术右移,保留符号语义。

12 bsr 2. % 3
bxor严格保留字位运算符

对整数逐位执行异或运算。

对应位不同时结果位为 1,相同时为 0。

6 bxor 3. % 5
case严格保留字模式分支

根据模式匹配选择并执行一个分支。

case 表达式求值一次,然后按顺序尝试 of 后的模式和可选守卫。

case X of
  0 -> zero;
  _ -> other
end.
catch严格保留字异常捕获

捕获表达式产生的异常或抛出值。

既可作为旧式 catch Expression,也用于 try 的 catch 子句;新代码通常优先使用结构更清楚的 try。

Result = catch risky().
cond严格保留字保留未使用

被词法分析器保留,但当前没有 cond 表达式。

它不能作为未加引号的原子、变量或函数名使用;条件分支请使用 case 或 if。

当前 Erlang 语法未使用该词。
erl_scan:reserved_word('cond'). % true
div严格保留字算术运算符

执行整数除法并返回整数商。

结果向零截断;除数为零会引发 badarith 错误。

7 div 2. % 3
else严格保留字maybe 失败分支

处理 maybe 表达式中 ?= 匹配失败的值。

else 后使用模式子句选择失败结果;它是 maybe 表达式语法的一部分,而非通用 if-else。

与 maybe 表达式一同使用;旧版 OTP 可能不支持该语法。
maybe {ok, V} ?= fetch(), V else error -> missing end.
end严格保留字表达式块终点

结束 case、fun、if、receive、try 等表达式块。

Erlang 的多分支表达式都使用 end 明确闭合。

fun(X) -> X * 2 end.
fun严格保留字匿名函数或函数引用

创建匿名函数,或引用已有函数。

匿名函数可以拥有多个模式子句;Module:Function/Arity 形式可捕获远程函数。

Double = fun(X) -> X * 2 end.
if严格保留字守卫分支

按顺序选择第一个守卫为真的分支。

if 的条件是 guard 序列,不是任意表达式;没有分支命中会产生 if_clause 错误。

if N > 0 -> positive; true -> other end.
let严格保留字保留未使用

被词法分析器保留,但当前没有 let 表达式。

Erlang 通过模式匹配绑定变量;若需要名为 let 的原子,必须写成 'let'。

当前 Erlang 语法未使用该词。
erl_scan:reserved_word('let'). % true
maybe严格保留字顺序匹配表达式

顺序执行表达式,并在 ?= 匹配失败时提前返回。

适合串联多个可能失败的操作;可搭配 else 把失败值转换为统一结果。

maybe 表达式从 Erlang/OTP 25 引入;较旧版本不支持,早期版本可能需启用 maybe_expr 特性。
maybe
  {ok, V} ?= fetch(),
  V
end.
not严格保留字布尔运算符

对布尔值取反。

操作数必须是 true 或 false,否则会引发 badarg 错误。

not false. % true
of严格保留字模式子句引导词

引出 case 或 try 成功结果的模式分支。

在 case 中连接待匹配表达式与子句;在 try 中可选择性处理主体的正常返回值。

case Value of ok -> done; _ -> retry end.
or严格保留字严格布尔运算符

计算两侧后执行布尔逻辑或。

两侧都必须是布尔值,而且不会短路;需要短路时使用 orelse。

false or true. % true
orelse严格保留字短路布尔运算符

左侧为 false 时才计算右侧。

常用于提供兜底条件,并避免左侧已满足时执行有副作用或昂贵的右侧表达式。

Cached orelse filelib:is_file(Path).
receive严格保留字进程消息接收

从当前进程邮箱中选择性接收匹配消息。

消息按到达顺序扫描,只有匹配某个子句的消息才会被取出;可使用 after 设置超时。

receive
  {ping, From} -> From ! pong
end.
rem严格保留字算术运算符

返回整数除法的余数。

它与 div 配套,并满足 X = (X div Y) * Y + (X rem Y)。

7 rem 2. % 1
try严格保留字异常处理表达式

处理正常结果、异常和最终清理逻辑。

可组合 of、catch 和 after 子句,精确区分成功值以及 error、exit、throw 类别。

try risky() catch _:Reason -> {error, Reason} end.
when严格保留字守卫子句

为函数或模式分支增加守卫条件。

守卫只能使用允许的 guard 表达式;它在模式匹配成功后决定子句是否可选。

abs(N) when N < 0 -> -N.
xor严格保留字布尔运算符

执行布尔异或,两侧不同时为 true。

两侧都会计算且必须是布尔值;它不是整数位异或,整数位异或请使用 bxor。

true xor false. % true
先分层,再记忆

“看起来像关键字”不等于保留字

Elixir 语法高度宏化,同样一段自然语言般的代码,可能横跨词法、 特殊形式和普通宏三个层级。

01lexer level

严格保留字

编译器在词法阶段就赋予特殊含义,不能随意拿来当普通变量或函数名。本页默认先展示这一层。

Elixir: when · fn · do
Erlang: case · receive · fun
02language building block

特殊形式

Elixir 的语言基本构造,无法被开发者覆盖;但除 fn 外,它们大多不在严格保留字清单里。

case · with · receive
alias · quote · unquote
03common syntax

宏、属性与指令

写起来很像关键字,却属于 Kernel 宏、Erlang 模块属性或预处理器。理解这点,元编程就不再神秘。

defmodule · use · if
-module · -spec · -define
官方依据

字典给解释,官方文档给完整语义

清单以当前官方语言参考为准。Erlang 的 maybe 在 OTP 25–26 默认关闭,自 OTP 27 起默认开启;condlet 目前仍是“已保留但未使用”。

带一个词去 Playground 试