我有这个编:
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) ;
然后我“创造世界”,我得到了错误:
错误(警告40):从类型Lexing.lexbuf中选择了lex_buffer_len。 它在当前范围中不可见,并且不会 如果类型未知,则选择它。
为什么不能在其中使用?在这种情况下如何打印lex_buffer_len?谢谢!
答案 0 :(得分:2)
如错误文本所示,字段lex_buffer_len
属于Lexing
模块中定义的类型。因此,引用它的正确方法是事先写lexbuf.Lexing.lex_buffer_len
或open Lexing
。
OCaml可让您在没有歧义的情况下执行lexbuf.lex_buffer_len
(并且lexing.cmi
在它搜索签名的目录之一中,但是对于标准库模块,除非您明确指定,否则总是这样)告诉它忽略stdlib),但是,由于这样做很危险(如果在某个时候定义了一个具有类似名称的字段的类型,将会发生奇怪的错误),这会受到警告,并且似乎给与的选项在编译器引导期间,OCaml使警告40错误(请参阅OCaml manual中的选项-w
和-warn-error
)