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