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

时间:2012-12-13 14:47:29

标签: compiler-construction ocaml

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

2 个答案:

答案 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相同的代码来解析代码......