为什么在ocaml的编译代码中不能得到lexbuf.lex_buffer_len?

Why can't get lexbuf.lex_buffer_len in ocaml's compiler code?

我有这个程序:

let ()=
 let filename = "/home/wk/prog/LocationTest/b.ml" in
 Location.input_name := filename ;
 let readhandle = open_in filename in
 let buf = Lexing.from_channel readhandle in
 Printf.printf "%d" (buf.lex_buffer_len) ;

效果很好

但是如果我使用 Printf.printf "%d" (buf.lex_buffer_len)

ocaml的4.07编译源码/driver/pparse.ml第181行:

let lexbuf = Lexing.from_channel ic in
Printf.printf "%d" (lexbuf.lex_buffer_len) ;

然后我 "make world",我得到错误:

错误(警告 40):从类型 Lexing.lexbuf 中选择了 lex_buffer_len。 它在当前范围内不可见,也不会 如果类型未知,则选择。

为什么不能在那里使用?如何在这种情况下打印lex_buffer_len?谢谢!

如错误文本所示,字段 lex_buffer_len 属于 Lexing 模块中定义的类型。因此,正确的引用方式是预先写成 lexbuf.Lexing.lex_buffer_lenopen Lexing

OCaml 允许您在没有歧义的情况下执行 lexbuf.lex_buffer_len(并且 lexing.cmi 在它搜索签名的目录之一中,但对于标准库模块,情况总是如此,除非您明确告诉它忽略 stdlib),但是,因为它可能很危险(如果在某些时候您定义了一个具有类似命名字段的类型,则会发生奇怪的错误),这会受到警告,并且选项似乎在编译器的 bootstrap 期间给 OCaml 使警告 40 成为错误(请参阅 OCaml manual 中的选项 -w-warn-error