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

不认识这个词?来这里查。

可以搜英文词,也可以搜“模式匹配”“异常”“短路”等中文解释。每项都列出分类、作用、限制和最小示例。

可搜索字典

查作用,也看最小示例

页面默认显示严格保留字。要找 defmodule、with 或 -module,切换到对应分类。

语言

共 44 项

可按语言或分类缩小范围

Elixir

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

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

让收尾工作一定执行,也能给收消息设定最长等待时间。

try ... after 会在离开 try 前执行清理;receive ... after 只结束这次等待,不会撤回已经发送的消息。

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

判断两个布尔条件是不是同时为 true。

两边必须是 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 等打开的代码块。

缩进只帮助人阅读,不能代替语法;多行代码块必须用 end 明确结束。

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

表示“否”或“条件不成立”。

Elixir 的条件判断只把 false 和 nil 当作假值,0、空字符串和空列表都算真值。

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

创建没有名字、可传给其他代码的函数。

匿名函数可以有多个模式匹配子句;保存在变量里以后,要用 变量.(参数) 的点号形式调用。

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

检查一个值是否在列表或范围中。

in 也能用于 guard;它只检查成员关系,推导式里从集合取值使用的是 <-。

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

表示这里暂时没有值。

nil 是原子 :nil 的字面写法,在条件判断中算假;它常表示“没找到”或可选值缺席。

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

把 true 变成 false,把 false 变成 true。

not 只接受 true 或 false;如果要对 nil 或其他数据按真值取反,使用 !。

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

判断两个布尔条件里是否至少有一个为 true。

两边必须是 true 或 false;左边为 true 时右边不会运行。需要按真值判断其他数据时用 ||。

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

当 try 里发生普通异常时,按异常类型处理它。

可以只接住 ArgumentError 等指定异常;没有匹配到的异常仍会继续向外传。

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

表示“是”或“条件成立”。

true 是原子 :true 的字面写法,也常在 cond 的最后一条分支里表示“其他情况都走这里”。

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

模式先对上以后,再检查一个额外条件。

when 里的 guard 只能使用允许的运算符和函数;普通函数不能随意放进去。

帮助理解像城门先核对姓名,再检查通行条件。两项都符合才放行。
def positive?(n) when n > 0, do: true

Erlang

29 个严格保留字、常见模块属性和预处理指令

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

让收消息不必一直等,也能保证 try 离开前做清理。

receive ... after 到时只停止等待;try ... after 中的表达式会在离开 try 前执行。

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

把两边都算完,再判断它们是不是同时为 true。

两边都必须是布尔值,而且右边一定会运行;不想在左边为 false 时运行右边,请用 andalso。

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

先看左边,只有左边为 true 才继续算右边。

两边都应得到布尔值;它常把安全检查放在前面,避免右边做没有必要或可能出错的计算。

帮助理解像先确认桥能走,再让车上桥。第一步失败,后一步不做。
N > 0 andalso N rem 2 =:= 0.
band严格保留字位运算符

逐个比较两个整数的二进制位,只有两边都是 1 才留下 1。

它只处理整数,常用来读取掩码、标志位或二进制协议里的某几位。

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

把几步计算包在一起,当成一个完整表达式。

各步用逗号分开并按顺序执行,整个 begin ... end 最终得到最后一步的值。

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

把整数二进制表示里的每一位反过来。

Erlang 整数没有固定的 8 位、32 位上限,因此结果按无限精度整数的规则计算。

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

逐个比较两个整数的二进制位,只要一边是 1 就得到 1。

它只处理整数,常用来把多个互不冲突的位标志合在一起。

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

把整数的二进制位整体向左挪几格。

位移数量为正时,效果通常等于乘以相应次方的 2;它只接受整数。

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

把整数的二进制位整体向右挪几格。

它只接受整数;负数使用算术右移,会保留负号所代表的符号语义。

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

逐个比较两个整数的二进制位,不一样时得到 1。

相同的位得到 0,不同的位得到 1;这是整数位运算,不是布尔 xor。

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

根据值的形状,执行第一个匹配分支。

case 只把目标表达式算一次,再从上到下尝试 of 后的模式与可选 guard;没有命中会报错。

帮助理解像驿站按信封标记分信。第一条匹配规则决定信送到哪里。
case X of
  0 -> zero;
  _ -> other
end.
catch严格保留字异常捕获

接住表达式抛出的值或错误,让它变成可以继续处理的结果。

它既有旧式 catch Expression 写法,也出现在 try 的 catch 子句中;新代码通常用结构更清楚的 try。

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

这个名字被 Erlang 留着,但现在不能拿它写 cond 条件块。

cond 不能直接当原子、变量或函数名;需要这个原子时写 'cond',条件分支使用 case 或 if。

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

用两个整数相除,只保留整数部分。

结果朝 0 的方向截断,不会四舍五入;除数为 0 会产生 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 等代码块。

缩进不能结束这些表达式;每个打开的多行块都要用 end 明确闭合。

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

做一个匿名函数,或者把已有函数当成一个值拿来使用。

匿名函数可以有多个模式子句;fun Module:Function/Arity 可以引用已经存在的远程函数。

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

从上到下检查条件,执行第一条 guard 为 true 的分支。

if 里只能写允许的 guard 表达式,不是任意函数调用;没有分支命中会产生 if_clause 错误。

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

这个名字被 Erlang 留着,但现在没有可以使用的 let 表达式。

Erlang 用模式匹配绑定变量;如果确实需要名为 let 的原子,必须写成 'let'。

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

把几步可能失败的操作排好,一步没对上就提前停下。

?= 只在 maybe 中使用;匹配失败时返回失败值,也可以交给 else 转成统一结果。

帮助理解像通关文牒逐站盖印。少一枚印,后面先停下。
maybe 表达式从 Erlang/OTP 25 引入;较旧版本不支持,早期版本可能需启用 maybe_expr 特性。
maybe
  {ok, V} ?= fetch(),
  V
end.
not严格保留字布尔运算符

把 true 变成 false,把 false 变成 true。

not 只接受布尔值;传入数字、原子等其他数据会产生 badarg 错误。

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

引出 case 或 try 中按结果形状划分的分支。

case 用 of 引出分支。try 可省略 of;它只处理 try 主体正常返回的值。

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

把两边都算完,再判断是否至少有一边为 true。

两边都必须是布尔值,而且右边一定会运行;不想在左边为 true 时运行右边,请用 orelse。

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

先看左边,只有左边为 false 才继续算右边。

两边都应得到布尔值;左边已经满足时,右边不会运行,所以它常用来安排备用条件。

帮助理解像先试近路。近路能走就不再检查备用路线。
Cached orelse filelib:is_file(Path).
receive严格保留字进程消息接收

从当前进程的 mailbox 里取出第一条符合规则的消息。

消息按到达顺序扫描,不匹配的会留在 mailbox 中;可以用 after 避免一直等待。

帮助理解像从一叠来信中取出第一封合规的信。其他信仍留在信箱里。
receive
  {ping, From} -> From ! pong
end.
rem严格保留字算术运算符

计算两个整数相除后的余数。

rem 与 div 配套,并满足 X = (X div Y) * Y + (X rem Y);除数为 0 会报错。

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

把可能出错的计算、成功结果和收尾工作放在一起处理。

try 可以组合 of、catch 和 after,分别处理正常值以及 error、exit、throw;没有匹配的错误仍会向外传。

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

模式先对上以后,再检查一个额外条件。

when 后只能使用允许的 guard 表达式;普通函数不能随意放进去,条件为 false 时会继续尝试下一子句。

帮助理解像先按名册找到队伍,再核对年龄。两项都符合才进入。
abs(N) when N < 0 -> -N.
xor严格保留字布尔运算符

判断两个布尔值是否恰好一真一假。

两边都会运行且都必须是布尔值;整数每一位的异或运算要使用 bxor。

true xor false. % true
分类说明

写法相似,分类不同

保留字、特殊形式、宏和模块属性由不同机制处理。先看作用,再记分类。

01严格保留字

语言预留的词

语言已经使用这些名字,不能再拿来给变量或函数起名。

Elixir: when · fn · do
Erlang: case · receive · fun
02特殊形式

语言内建结构

它们组成 Elixir 基本语法,由编译器直接处理,但多数不是严格保留字。

case · with · receive
alias · quote · unquote
03宏、属性与指令

常用宏和声明

它们写起来像关键字,实际可能是宏、模块属性或预处理指令。

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

看完解释,再查原文

本页按官方资料整理。Erlang 的 maybe 在 OTP 25–26 中默认关闭,从 OTP 27 起默认开启。cond 和let 虽然被保留,目前还没有实际语法用途。

去 Playground 试一个词