OCaml表达式序列中尾随分号是否可选?为何该代码可正常运行?
OCaml表达式序列尾随分号合法的原因
先看你给出的可运行代码:
let t = let a = 1 in (); let b = 2 in a + b;
按照OCaml官方文档里表达式序列的语法定义,确实应该是<expr>;<expr>这样交替的结构,不允许末尾带分号,但实际代码能正常运行的原因是:OCaml解析器做了兼容性处理——当表达式序列末尾出现尾随分号时,会自动在分号后补一个隐式的()(单位值表达式)。
换句话说,上面的代码会被解析器等价转换为:
let t = let a = 1 in (); let b = 2 in a + b; ()
最终t的值是(),因为表达式序列的结果由最后一个表达式决定。
对应你提出的两个猜测,这属于第一种情况的扩展:解析器不是单纯忽略尾随分号,而是通过补全合法表达式的方式,避免开发者因误打分号触发编译错误,提升开发便利性。
内容的提问来源于stack exchange,提问作者Sion Kim
相关产品推荐
相关产品推荐

