Elixir中如何区分arity表示与算术除法?编译器判定规则解析
Erlang/Elixir函数捕获中
/的语法解析规则 语法优先级与结构匹配规则
在Erlang/Elixir的语法定义里,模块名.函数名/元数是原子性的语法单元,优先级高于除法运算。编译器会优先匹配这种结构:当/右侧是正整数常量,左侧是模块名.函数名的标识符组合时,直接解析为函数引用(表示对应元数的函数),而非除法运算。如果是除法,语法要求/左右两侧都是可求值的表达式,比如X.f()/1(这里X.f()是函数调用表达式,/才会被解析为除法)。捕获运算符
&的上下文影响&(...)并没有单独改变/的解析规则,而是因为捕获运算符的语义要求其参数是函数引用、匿名函数或表达式。当括号内出现X.f/1时,由于它完全符合函数引用的语法结构(右侧是整数常量),所以直接被识别为要捕获的目标函数,不会触发除法的解析逻辑。如果写成&(X.f()/1),这里的/就会被解析成除法,因为左侧是函数调用的结果,而非函数名标识符。编译器的判断逻辑
编译器在语法分析阶段,会按照预定义的语法规则匹配结构:- 先尝试匹配
<module>.<function>/<arity>规则,其中<arity>必须是无符号整数; - 如果匹配失败,再尝试匹配除法运算的
<expression> / <expression>规则。
比如X.f/a会直接报错,因为a不是整数常量,既不符合函数引用的元数要求,也不符合除法的合法表达式结构(若要表示除法,需写成X.f()/a)。
- 先尝试匹配
内容的提问来源于stack exchange,提问作者user1934428
相关产品推荐
相关产品推荐

