Ocaml - 编译器和手册之间的差异

Joe*_*Joe 1 compiler-construction ocaml

所以我正在阅读http://www.podval.org/~sds/ocaml-sucks.html,其中包含此引用(在ocaml问题的上下文中):

实际上有三种略有不同的语法:

  • 官方的描述在手册中
  • 编译器ocamlc接受其超集
  • 预处理器Camlp4接受类似的东西(但是有点不同)(例如,它接受List.map [1; 2; 3] ~f:fun x - > x,这也被顶层接受,但是不是编译器)

ocamlc接受但与手册不匹配的ocaml代码片段的示例是什么?

PS - 我主要对OCaml 4.00.1感兴趣,但以前的版本也很有趣......

gas*_*che 5

一个有趣的例子,仅为了好奇心:

                  OCaml version 4.00.0

# type 'a weird_list =
    | ()
    | :: of 'a * 'a weird_list;;
type 'a weird_list = () | :: of 'a * 'a weird_list
# 1::2::3::();;
- : int weird_list = :: (1, :: (2, :: (3, ())))
Run Code Online (Sandbox Code Playgroud)

Camlp4和OCaml编译器之间的差异有时是错误,但最常见的解释是解析器技术的不同之处:如果你为同一种语言编写一个惯用的LR解析器和一个LL解析器,并且有轻微烦人的语法细微之处,你不应该期望两者兼而有之.完美匹配.我不认为这在实践中是一个问题(但实际上大多数人不使用Camlp4).