所以我正在阅读http://www.podval.org/~sds/ocaml-sucks.html,其中包含此引用(在ocaml问题的上下文中):
实际上有三种略有不同的语法:
- 官方文件在手册中描述
- 编译器ocamlc
接受其超集- 预处理器Camlp4接受类似的东西(但是稍微不同)(例如,它接受List.map [1; 2; 3] ~f:有趣的x - > x,也被顶级接受,但不是 编译器)
ocamlc接受但与手册不匹配的ocaml代码片段的示例是什么?
PS - 我主要对OCaml 4.00.1感兴趣,但以前的版本也很有趣......
答案 0 :(得分: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)。
答案 1 :(得分:2)
这个页面已经很老了,不确定,它仍适用于所有点。
第三项是假的,考虑到ocaml 4.00 toplevel(考虑到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,toplevel使用与ocaml相同的代码来解析代码......