我是 OCaml 的新手,我想知道这个语句是如何工作的:
# 1 + 1 ;;;;
- : int = 2
# 1 + 1 ;;;;;;;;
- : int = 2
是否被;;;;
视为与1+1
中blank
的组合(((1 + 1);););;
?或者;;;;
以其他方式被视为多字符?
我是 OCaml 的新手,我想知道这个语句是如何工作的:
# 1 + 1 ;;;;
- : int = 2
# 1 + 1 ;;;;;;;;
- : int = 2
是否被;;;;
视为与1+1
中blank
的组合(((1 + 1);););;
?或者;;;;
以其他方式被视为多字符?
正如这里所讨论的,;;
在顶级 REPL 中会忽略它之后的所有内容。将代码写入文件并编译它们时,不需要双分号。引用 Daniil Baturin 的我希望在学习 OCaml 时知道的内容,
;;
“我什么时候需要OCaml 内部源代码?”这个问题的答案 从来没有。它不是语言的一部分,仅被解释器用作输入标记的结束。
修改后的Ocaml语法;;
去掉了以下参数:
OCaml 中的双分号存在历史原因:第一个解析器是由令牌驱动的,而不是由规则驱动的:所有结构都需要有一个特定的令牌。
但由于 OCaml 中引入了模块,Caml Light 中强制用于结束句子的双分号变成了可选的:原因是在 OCaml 中,“短语”和“结构项”实际上是同一个概念。问题是双分号与“终止”某些东西的概念相关联:对于一个短语,它是精确的,但对于结构内的结构项则不是,因为其他结构项和关键字“ end ”紧随其后。
让双分号在正常语法中可选的选择引入了几个问题:
一个结构项实际上在下一个结构项的开始处结束;这意味着所有结构项都必须以关键字开头;否则有歧义。例如,你不能写:
print_string "hello, world" print_newline ()
因为它被解释为使用 3 个参数(和输入错误)调用 print_string。提倡的解决方案是写:
let _ = print_string "hello, world" let _ = print_newline ()
嗯……
但是这个解决方案不能交互地工作:在顶层,你不能要求人们输入下一个句子的开头来查看当前句子的结果。因此双分号仍然存在!我们像在源文件中一样在顶层写入的属性已经丢失。
在结构和对象中,不结束结构项和对象项的事实使程序更难阅读。如果您只在一行中编写一个简短的对象或结构项,则很难看到这些项的开始和结束位置。
我的观点是,结构项应该在永远不需要读取另一个标记的上下文中以标记结尾。这确保了交互式顶层中的正确行为。在修改后的语法中,序列是闭合的这一事实释放了简单的分号。一个简单的分号在结构和对象内部是完全可以接受的,以结束它们的项目,就像他们关闭一个记录项目一样。在修改后的语法中,这个结束分号是强制性的。
处理所有短语都以标记结尾的语言更容易:在句子的末尾,字符和标记流是同步的(无需读取额外的标记来确保短语结束)。此属性可以简化其他处理(提取注释或文档代码、缩进、编辑器模式、交互式工具)。
[...]