所以我正在阅读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 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)。
此页面相当旧,不确定,但所有要点仍然正确。
考虑到 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 相同的代码来解析代码...