在parsetree.mli中使用Pexp_ident是什么意思?

时间:2018-11-20 02:40:45

标签: ocaml

我有这个prog parsetreetest.ml:

let ()=
let filename = "test.ml" in
Location.input_name := filename ;
let readhandle = open_in filename in
let buf = Lexing.from_channel readhandle in
Location.init buf filename ;
let ast = Parse.implementation buf in
let pstr_desc=(List.nth ast 0).pstr_desc in
match pstr_desc with
|Pstr_eval (expression,attributes)->
 match expression.pexp_desc with
 |Pexp_constant constant->
  match constant with 
  |Pconst_integer (const_int,char_option)->
   Printf.printf "%s" const_int;
 close_in readhandle

如果test.ml仅具有整数,例如:1,则该编可以读取它并返回Parsetree。

在parsetree.mli中:

and expression_desc =

| Pexp_ident of Longident.t loc

    (* x

       M.x

     *)

| Pexp_constant of constant

    (* 1, 'a', "true", 1.0, 1l, 1L, 1n *)

如果我编写parsetreetest2.ml,则Pexp_ident与Pexp_constant平行:

let ()=
let filename = "test2.ml" in
Location.input_name := filename ;
let readhandle = open_in filename in
let buf = Lexing.from_channel readhandle in
Location.init buf filename ;
let ast = Parse.implementation buf in
let pstr_desc=(List.nth ast 0).pstr_desc in
match pstr_desc with
|Pstr_eval (expression,attributes)->
 match expression.pexp_desc with
 |Pexp_ident loc->
  match loc with 
  |Lident l->
   Printf.printf "%s" l;
 close_in readhandle

在test2.ml中,我写了x,如parsetree.mli示例所示,然后使用ocamlbuild编译器,该编译器成功地编译了parsetreetest.ml,出现了错误:

文件“ parsetreetest2.ml”,第14行,字符7-13: 错误:未绑定的构造函数Lident

我不知道为什么我不能这样做,谢谢!

1 个答案:

答案 0 :(得分:0)

您没有显示Lident的定义,因此显而易见的结论是,构造函数未定义,这正是编译器告诉您的。适用的案例不使用Lident,因此没有错误。

听起来您正在处理一些预先存在的文件。因此,要做的事情可能是环顾四周,找到Lident的定义,并确保它已被编译并且可以被编译器找到。

如果要从其他地方复制代码,则可能要查看其他代码中是否有任何open声明。可能使用open声明会使Lident在您的代码中可用。