after严格保留字收尾或超时子句让收尾工作一定执行,也能给收消息设定最长等待时间。
try ... after 会在离开 try 前执行清理;receive ... after 只结束这次等待,不会撤回已经发送的消息。
try do
work()
after
cleanup()
end可以搜英文词,也可以搜“模式匹配”“异常”“短路”等中文解释。每项都列出分类、作用、限制和最小示例。
页面默认显示严格保留字。要找 defmodule、with 或 -module,切换到对应分类。
共 44 项
可按语言或分类缩小范围15 个严格保留字、常用特殊形式和 Kernel 宏
after严格保留字收尾或超时子句try ... after 会在离开 try 前执行清理;receive ... after 只结束这次等待,不会撤回已经发送的消息。
try do
work()
after
cleanup()
endand严格保留字严格布尔运算符两边必须是 true 或 false;左边为 false 时右边不会运行。需要按真值判断其他数据时用 &&。
ready? and enabled?catch严格保留字捕获子句普通异常通常交给 rescue;catch 主要处理 throw/1、进程退出和较底层的错误类别。
try do
throw(:stop)
catch
:throw, reason -> reason
enddo严格保留字代码块起点多行内容写成 do ... end;只有一个表达式时,也可以缩写成 do: expression。
if ready?, do: run()else严格保留字备选子句它可出现在 if、unless、with 和 try 中;放在不同结构里,触发它的规则并不完全一样。
if ok?, do: :yes, else: :noend严格保留字代码块终点缩进只帮助人阅读,不能代替语法;多行代码块必须用 end 明确结束。
if ready? do
run()
endfalse严格保留字布尔字面量Elixir 的条件判断只把 false 和 nil 当作假值,0、空字符串和空列表都算真值。
active? = falsefn严格保留字匿名函数匿名函数可以有多个模式匹配子句;保存在变量里以后,要用 变量.(参数) 的点号形式调用。
double = fn x -> x * 2 end
double.(3)in严格保留字成员关系运算符in 也能用于 guard;它只检查成员关系,推导式里从集合取值使用的是 <-。
2 in 1..3nil严格保留字空值字面量nil 是原子 :nil 的字面写法,在条件判断中算假;它常表示“没找到”或可选值缺席。
result = nilnot严格保留字严格布尔运算符not 只接受 true 或 false;如果要对 nil 或其他数据按真值取反,使用 !。
not finished?or严格保留字严格布尔运算符两边必须是 true 或 false;左边为 true 时右边不会运行。需要按真值判断其他数据时用 ||。
cached? or fetch?()rescue严格保留字异常子句可以只接住 ArgumentError 等指定异常;没有匹配到的异常仍会继续向外传。
try do
risky()
rescue
ArgumentError -> :invalid
endtrue严格保留字布尔字面量true 是原子 :true 的字面写法,也常在 cond 的最后一条分支里表示“其他情况都走这里”。
enabled? = truewhen严格保留字守卫子句when 里的 guard 只能使用允许的运算符和函数;普通函数不能随意放进去。
def positive?(n) when n > 0, do: true29 个严格保留字、常见模块属性和预处理指令
after严格保留字超时或收尾子句receive ... after 到时只停止等待;try ... after 中的表达式会在离开 try 前执行。
receive
Msg -> Msg
after 1000 ->
timeout
endand严格保留字严格布尔运算符两边都必须是布尔值,而且右边一定会运行;不想在左边为 false 时运行右边,请用 andalso。
true and false. % falseandalso严格保留字短路布尔运算符两边都应得到布尔值;它常把安全检查放在前面,避免右边做没有必要或可能出错的计算。
N > 0 andalso N rem 2 =:= 0.band严格保留字位运算符它只处理整数,常用来读取掩码、标志位或二进制协议里的某几位。
6 band 3. % 2begin严格保留字表达式块各步用逗号分开并按顺序执行,整个 begin ... end 最终得到最后一步的值。
begin A = 1, A + 1 end.bnot严格保留字位运算符Erlang 整数没有固定的 8 位、32 位上限,因此结果按无限精度整数的规则计算。
bnot 0. % -1bor严格保留字位运算符它只处理整数,常用来把多个互不冲突的位标志合在一起。
4 bor 1. % 5bsl严格保留字位移运算符位移数量为正时,效果通常等于乘以相应次方的 2;它只接受整数。
3 bsl 2. % 12bsr严格保留字位移运算符它只接受整数;负数使用算术右移,会保留负号所代表的符号语义。
12 bsr 2. % 3bxor严格保留字位运算符相同的位得到 0,不同的位得到 1;这是整数位运算,不是布尔 xor。
6 bxor 3. % 5case严格保留字模式分支case 只把目标表达式算一次,再从上到下尝试 of 后的模式与可选 guard;没有命中会报错。
case X of
0 -> zero;
_ -> other
end.catch严格保留字异常捕获它既有旧式 catch Expression 写法,也出现在 try 的 catch 子句中;新代码通常用结构更清楚的 try。
Result = catch risky().cond严格保留字保留未使用cond 不能直接当原子、变量或函数名;需要这个原子时写 'cond',条件分支使用 case 或 if。
erl_scan:reserved_word('cond'). % truediv严格保留字算术运算符结果朝 0 的方向截断,不会四舍五入;除数为 0 会产生 badarith 错误。
7 div 2. % 3else严格保留字maybe 失败分支else 后面仍用模式子句选择结果;它只属于 maybe 语法,并不是任何地方都能使用的 if-else。
maybe {ok, V} ?= fetch(), V else error -> missing end.end严格保留字表达式块终点缩进不能结束这些表达式;每个打开的多行块都要用 end 明确闭合。
fun(X) -> X * 2 end.fun严格保留字匿名函数或函数引用匿名函数可以有多个模式子句;fun Module:Function/Arity 可以引用已经存在的远程函数。
Double = fun(X) -> X * 2 end.if严格保留字守卫分支if 里只能写允许的 guard 表达式,不是任意函数调用;没有分支命中会产生 if_clause 错误。
if N > 0 -> positive; true -> other end.let严格保留字保留未使用Erlang 用模式匹配绑定变量;如果确实需要名为 let 的原子,必须写成 'let'。
erl_scan:reserved_word('let'). % truemaybe严格保留字顺序匹配表达式?= 只在 maybe 中使用;匹配失败时返回失败值,也可以交给 else 转成统一结果。
maybe
{ok, V} ?= fetch(),
V
end.not严格保留字布尔运算符not 只接受布尔值;传入数字、原子等其他数据会产生 badarg 错误。
not false. % trueof严格保留字模式子句引导词case 用 of 引出分支。try 可省略 of;它只处理 try 主体正常返回的值。
case Value of ok -> done; _ -> retry end.or严格保留字严格布尔运算符两边都必须是布尔值,而且右边一定会运行;不想在左边为 true 时运行右边,请用 orelse。
false or true. % trueorelse严格保留字短路布尔运算符两边都应得到布尔值;左边已经满足时,右边不会运行,所以它常用来安排备用条件。
Cached orelse filelib:is_file(Path).receive严格保留字进程消息接收消息按到达顺序扫描,不匹配的会留在 mailbox 中;可以用 after 避免一直等待。
receive
{ping, From} -> From ! pong
end.rem严格保留字算术运算符rem 与 div 配套,并满足 X = (X div Y) * Y + (X rem Y);除数为 0 会报错。
7 rem 2. % 1try严格保留字异常处理表达式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保留字、特殊形式、宏和模块属性由不同机制处理。先看作用,再记分类。
语言已经使用这些名字,不能再拿来给变量或函数起名。
Elixir: when · fn · do
Erlang: case · receive · fun它们组成 Elixir 基本语法,由编译器直接处理,但多数不是严格保留字。
case · with · receive
alias · quote · unquote它们写起来像关键字,实际可能是宏、模块属性或预处理指令。
defmodule · use · if
-module · -spec · -define本页按官方资料整理。Erlang 的 maybe 在 OTP 25–26 中默认关闭,从 OTP 27 起默认开启。cond 和let 虽然被保留,目前还没有实际语法用途。