Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Syntax begin..end是OCaml语法糖吗?_Syntax_Ocaml - Fatal编程技术网

Syntax begin..end是OCaml语法糖吗?

Syntax begin..end是OCaml语法糖吗?,syntax,ocaml,Syntax,Ocaml,查看唯一出现begin的产品中的非官方OCaml语法是: Expression ::= begin Expression end 再往下一点,你会看到: Expression ::= ( Expression [:Type] ) 再加上在一些琐碎的代码(不影响正确性)中用(/)随意替换开始/结束),似乎表明开始结束关键字只是语法上的糖分。还是我遗漏了什么?“语法糖”意味着对其他结构的简单但并非琐碎的翻译开始。。end不是语法糖,它与(…)是冗余的,因为它做的是完全相同的事情 如果您

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

Expression ::= begin Expression end
再往下一点,你会看到:

Expression ::= (   Expression  [:Type]   )

再加上在一些琐碎的代码(不影响正确性)中用
/
随意替换
开始
/
结束
),似乎表明
开始
结束
关键字只是语法上的糖分。还是我遗漏了什么?

“语法糖”意味着对其他结构的简单但并非琐碎的翻译<代码>开始。。end不是语法糖,它与
(…)
是冗余的,因为它做的是完全相同的事情


如果您感兴趣,其目的是程序员可以使用
begin。。结束
以包含命令式表达式(因其副作用而执行),并结束(..)以包含具有非单位值的表达式。但是编译器并没有强制执行这一点,语言的设计者只是认为如果以这种方式使用它们会更好,仅此而已。

事实上,对于不同的语法规则,OCaml语法中有几种括号的用法,并且不是所有的括号都可以与begin..end一起使用。圆括号和begin..end可以用作语义无关的表达式分隔符以消除歧义(如您所说,
expr::='('expr')”
()
还表示类型
unit
的常量,作为双关语,
开始-结束
也可以在那里使用——但是手册中没有指定最后一个,只有实现始终支持它

但也可以使用括号

  • 要划分模式:
    函数(::::。->…
  • 作为
    数组的语法糖。get
    数组。set
    t.(i)
    t.(i)t)
    (e:s:>t)
  • 要形成带标签的模式化合物:
    fun~(x:int)
    fun?(x=10)
  • 在模块中的各种相关位置(强制、注释等),签名和类/对象是语法的一部分
因为这些用法都不能用begin..end来代替,所以将
替换为
begin
系统地替换为
end
(反之亦然)


很抱歉这个迂腐的回答,但问题本身就相当精确。我不确定begin..end处理是OCaml语法中最优雅的部分(它有很多缺点)。有人可能希望它们真的是等价的,但是坚持写
beginx:int end
而不是
(x:int)

没有什么意义,谁说语法的糖分必须是不平凡的?这到底是什么意思?如果OCaml编译器翻译了
begin。。end
(..)
内部,前者是语法上的糖。编译器在任何意义上都不会这样做。相反,这两个构造都隐式编码在AST的构造中。安德烈亚斯罗斯伯格:我知道文化差异和所有这些,但我觉得你的评论有点徒劳无益。既然您是在表示不同意,那么您能试着解释一下您的观点吗?例如,“为什么您说您不能用Ocaml单独编译本机代码?当然可以。”?在这种情况下,我不应该告诉你去关注我已经提供的链接,或者重复那里说的话。如果我的回复被认为是没有效果的,我道歉。我只是质疑你的定义,因为额外的附加条件似乎相当武断,这是我第一次听到有人把非琐碎性作为标准。同样,“一个没有转换成另一个”是一个实现细节,所以我不认为它有多重要。(关于独立汇编的辩论,我不知道该说什么,除了争辩说链接没有支持你的实际陈述,正如其他人所指出的那样。)帕斯卡,我很抱歉,但我不得不再次不同意你的观点。讨论答案就是评论的目的,对吗?(尽管风格不同,但我承认你可以有所作为。)假设你观察到一个答案有错误或完全错误,你会让它不加注释吗?那么谁会得到帮助呢?迂腐意味着精确,有着过度精确的强烈内涵。你的回答很准确。