我是OCaml的新手,我想知道该语句如何工作:
# 1 + 1 ;;;;
- : int = 2
# 1 + 1 ;;;;;;;;
- : int = 2
是否像;;;;
一样将1+1
与blank
和(((1 + 1);););;
组合在一起?还是以其他方式将;;;;
视为多字符?
答案 0 :(得分:4)
与discussed here一样,顶级REPL中的;;
会忽略后面的所有内容。将代码写入文件并进行编译时,不需要双分号。引用丹尼尔·巴图林(Daniil Baturin)的What I wish I knew when learning OCaml,
“何时需要在OCaml源代码中使用
;;
?”的答案是从不。它不是语言的一部分,仅由解释器用作输入标记的结尾。
Ocaml的revised syntax通过以下参数摆脱了;;
:
OCaml中存在双分号的原因是历史原因:第一个解析器是由标记驱动的,而不是由规则驱动的:所有构造都需要具有特定的标记。
但是由于在OCaml中引入了模块,双引号(在Caml Light中强制使用结尾语句)成为可选的:原因是在OCaml中,出现了一个' phrase '和一个“ 结构项”实际上是同一概念。问题在于双分号与“ 终止”的概念相关联:对于短语来说,它是准确的,但对于结构内的结构项却不是,因为其他结构项和关键字' end '。
让双分号在常规语法中为可选的选择带来了几个问题:
结构项实际上是由下一个结构项的开头结束的;这意味着所有结构项都必须以关键字开头;否则存在歧义。例如,您不能写:
print_string "hello, world" print_newline ()
因为它被解释为对具有3个参数的print_string的调用(并键入错误)。提倡的解决方案是编写:
let _ = print_string "hello, world" let _ = print_newline ()
mm ....
但是该解决方案不能交互工作:在顶层,您不能要求人们键入下一个句子的开头来查看当前句子的结果。因此,双分号仍然存在!我们在顶层(如源文件)中编写的属性已丢失。
在结构和对象中,您没有结束结构项和对象项的事实使程序更加难以阅读。如果仅在一行中写一个简短的对象或结构项,则很难看到项的开始和结束位置。
我的观点是,在不需要读取其他令牌的上下文中,结构项应以令牌结尾。这样可以确保在交互式顶层中的正确行为。以修订的语法关闭序列的事实释放了简单的分号。简单的分号在结构和对象内部是完全可以接受的,以结束它们的项目,就像它们关闭记录项目一样。在修订后的语法中,此结尾分号是必需的。
对待所有短语都以标记结尾的语言更容易:在句子的末尾,字符和标记流同步(无需读取额外的标记以确保短语结束)。此属性可以简化其他处理方式(提取注释或文档代码,缩进,编辑器模式,交互式工具的代码)。
[...]