是开始......在OCaml语法糖?

Mar*_*tus 12 syntax ocaml

查看此站点中的非官方OCaml语法,唯一begin出现的产品是:

Expression ::= begin Expression end
Run Code Online (Sandbox Code Playgroud)

还有一点看到:

Expression ::= (   Expression  [:Type]   )
Run Code Online (Sandbox Code Playgroud)

这一点,以及一些简单的代码中的begin/ end(/ )在一些简单的代码(不影响正确性)的一些随意替换可能似乎表明begin end关键字只是语法糖.或者我错过了什么?

Pas*_*uoq 28

"句法糖"表示对其他构建体的简单但非平凡的翻译.begin .. end不是语法糖,它是多余( .. ),因为它完全相同的事情.

如果您感兴趣,那么程序员可以使用begin .. end包含命令式表达式,为其副作用执行,以及( .. )使用非单位值的表达式.但编译器没有强制执行,语言的设计者只是认为如果以这种方式使用它会看起来更好,就是这样.

  • @AndreasRossberg如果OCaml编译器在内部将`begin .. end`翻译为`(..)`,那么前者将是语法糖.编译器不会在任何有意义的意义上执行此操作.相反,两个构造都在AST的构造中被隐式编码.**一个没有翻译成另一个.** (5认同)
  • 帕斯卡尔,我很抱歉,但我不得不再次反对你.讨论答案是什么评论,对吗?(虽然风格,我授予你可以有所作为.)假设你发现答案有错误或者是完全错误的,你会不会忘记它?谁会得到帮助呢? (4认同)
  • 谁说语法糖必须是非平凡的?这究竟是什么意思?毫无疑问,我将开头归类为语法糖. (3认同)
  • 如果我的回复没有结果,我道歉.我只是在这里质疑你的定义,因为额外的条件似乎相当随意,而且这是我第一次听到有人把非平凡性作为一个标准.同样,"一个没有翻译成另一个"是一个实现细节,所以我不明白它是如何重要的.(重新进行单独的编译辩论,不知道该说些什么,除了争辩说链接没有支持你的实际陈述,正如其他人所指出的那样.) (3认同)

gas*_*che 10

实际上,对于不同的语法规则,OCaml语法中的括号有几种用法,并且并非所有这些用法都可以与begin..end一起使用.括号和begin..end可以用作无语义的表达式分隔符,用于消除歧义(如你所说expr ::= '(' expr ')').()也表示类型的常量,unit并且作为双关语,begin end也允许在那里 - 但是最后一个没有在手册中指定,只是一致地由实现支持.

但也可以使用括号

  • 划分模式: function (_::_)::_ -> ...
  • 作为语法糖Array.getArray.set:t.(i) t.(i) <- e
  • 对于(e : t)表达式和模式中的类型注释(这不是消除歧义的分隔符的特殊情况,因为它没有括号时无效)
  • 用于对强制进行分类:(e :> t)(e : s :> t)
  • 形成标记的图案化合物:fun ~(x:int) ..fun ?(x=10) ..
  • 在模块中的各种相关位置(强制,注释等),语法的签名和类/对象部分

对于没有这种用法可以BEGIN..END代替,所以它绝对不会是有效的,以取代(begin)end系统(而相反的是正确的).

对于迂腐的回答感到抱歉,但问题本身就非常准确.我不确定begin..end处理是OCaml语法中最优雅的部分(它有很多瑕疵).人们可能希望他们真的是等同的,但是坚持写作begin x : int end而不是没有什么意义(x : int).