为什么我可以添加任意数量的;在OCaml顶层行的末尾?

时间:2018-08-13 04:46:34

标签: ocaml ocaml-toplevel

我是OCaml的新手,我想知道该语句如何工作:

# 1 + 1 ;;;;
- : int = 2
# 1 + 1 ;;;;;;;;
- : int = 2

是否像;;;;一样将1+1blank(((1 + 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 ....

  •   
  • 但是该解决方案不能交互工作:在顶层,您不能要求人们键入下一个句子的开头来查看当前句子的结果。因此,双分号仍然存在!我们在顶层(如源文件)中编写的属性已丢失。

  •   
  • 在结构和对象中,您没有结束结构项和对象项的事实使程序更加难以阅读。如果仅在一行中写一个简短的对象或结构项,则很难看到项的开始和结束位置。

  •   
     

我的观点是,在不需要读取其他令牌的上下文中,结构项应以令牌结尾。这样可以确保在交互式顶层中的正确行为。以修订的语法关闭序列的事实释放了简单的分号。简单的分号在结构和对象内部是完全可以接受的,以结束它们的项目,就像它们关闭记录项目一样。在修订后的语法中,此结尾分号是必需的。

     

对待所有短语都以标记结尾的语言更容易:在句子的末尾,字符和标记流同步(无需读取额外的标记以确保短语结束)。此属性可以简化其他处理方式(提取注释或文档代码,缩进,编辑器模式,交互式工具的代码)。

     

[...]