OCaml编译器与手册的区别

问题描述 投票:0回答:2

所以我正在阅读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 感兴趣,但以前的版本也很有趣......

ocaml
2个回答
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, ())))

Camlp4 和 OCaml 编译器之间的差异有时是错误,但最常见的解释是解析器技术的差异:如果您为同一种语言编写惯用的 LR 解析器和 LL 解析器,并且具有稍微令人讨厌的语法微妙之处,那么您不应该期望两者都存在完美匹配。我认为这在实践中不是问题(但实际上大多数人不使用 Camlp4)。


2
投票

此页面相当旧,不确定,但所有要点仍然正确。

考虑到 ocaml 4.00 顶层,第三项是错误的(也考虑到 List.map 的参数顺序是错误的......):

 $ List.map  ~f:fun x -> x [1;2;3];;
 Error: Syntax error        
 $ List.map ~f:(fun x -> x) [1;2;3];;
 File "", line 1, characters  12-24:
 Error: The function applied to this argument has type 'a list -> 'b list 
 This argument cannot be applied with label ~f

AFAIK,顶层使用与 ocaml 相同的代码来解析代码...

© www.soinside.com 2019 - 2024. All rights reserved.