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

为什么我可以添加任意数量的;在OCaml顶级中的行的末尾?,ocaml,ocaml-toplevel,Ocaml,Ocaml Toplevel,我是OCaml新手,不知道这句话是怎么说的: # 1 + 1 ;;;; - : int = 2 # 1 + 1 ;;;;;;;; - : int = 2 是被认为是将1+1与blank组合在一起,如((1+1););)?或者是以其他方式作为多字符处理?作为,忽略它后面的所有内容。在将代码写入文件并编译它们时,不需要双分号。引用丹尼尔·巴图林的话 “我什么时候需要OCaml源代码中的;”这个问题的答案是从不 它不是语言的一部分,仅被解释器用作输入结束标记 Ocaml的功能摆脱了代码: OCaml

我是OCaml新手,不知道这句话是怎么说的:

# 1 + 1 ;;;;
- : int = 2
# 1 + 1 ;;;;;;;;
- : int = 2
被认为是将
1+1
blank
组合在一起,如
((1+1););)?或者是
以其他方式作为多字符处理?

作为,
忽略它后面的所有内容。在将代码写入文件并编译它们时,不需要双分号。引用丹尼尔·巴图林的话

“我什么时候需要OCaml源代码中的
”这个问题的答案是从不

它不是语言的一部分,仅被解释器用作输入结束标记

Ocaml的功能摆脱了
代码:

OCaml中的双分号是由于历史原因而存在的:第一个解析器是由标记驱动的,而不是由规则驱动的:所有构造都需要有一个特定的标记

但由于在OCaml中引入了模块,双分号在Caml语言中是必须的,在句子结束时是可以选择的:原因是在OCaml中,“短语”和“结构项”实际上是同一个概念。问题在于,双分号与“终止”某物的概念相关联:对于短语,它是精确的,但对于结构中的结构项,它不是精确的,因为后面跟着其他结构项和关键字“end”

在正常语法中选择双分号是可选的,这带来了几个问题:

  • 一个结构项实际上以下一个结构项的开头结束;这意味着所有结构项必须以关键字开头;否则就有歧义。例如,您不能写入:

    print_string "hello, world"
    print_newline ()
    
    因为它被解释为使用3个参数打印_字符串的调用(以及键入错误)。提倡的解决方案是写:

    let _ = print_string "hello, world"
    let _ = print_newline ()
    

  • 但是这个解决方案不能以交互方式工作:在顶层,您不能要求人们键入下一句的开头以查看当前句子的结果。因此,双分号仍然保留!与源文件一样,我们在顶级中写入的属性已丢失

  • 在结构和对象中,不结束结构项和对象项的事实使程序更难阅读。如果只在一行中写入一个短对象或结构项,则很难看到这些项的开始和结束位置

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

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

[……]


我想这是一个不同的问题,但是
(((1+1););)
还提供
-:int=2
。为什么会这样?我希望它返回
单位
;在表达式之后,将忽略。如果要返回单位,则必须添加单位值,如
(1+1);();;