Почему нельзя получить lexbuf.lex_buffer_len в коде компилятора ocaml? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть эта прога:

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's4.07 скомпилируйте исходный код /driver/pparse.ml строка 181:

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

затем я "создаю мир", я получил ошибку:

Ошибка (предупреждение 40): lex_buffer_len был выбран из типаLexing.lexbuf.Он не виден в текущей области видимости и не будет выбран, если тип станет неизвестным.

почему его нельзя использовать там? Как напечатать lex_buffer_len в этой ситуации? Спасибо!

1 Ответ

0 голосов
/ 20 сентября 2018

Как указано в тексте ошибки, поле lex_buffer_len относится к типу, определенному в модуле Lexing.Таким образом, правильный способ сослаться на него - написать lexbuf.Lexing.lex_buffer_len или open Lexing заранее.

OCaml позволяет вам делать lexbuf.lex_buffer_len, когда нет никакой неоднозначности (а lexing.cmi находится в одном из каталоговгде он ищет подписи, но для стандартного библиотечного модуля это всегда так, если вы явно не скажете ему игнорировать stdlib), но, поскольку это может быть опасно (если в какой-то момент вы определяете тип с аналогичным именем поля, странноошибки будут возникать), это может быть вызвано предупреждением, и похоже, что параметры, данные OCaml во время начальной загрузки компилятора, делают предупреждение 40 ошибочным (см. параметры -w и -warn-error в руководстве OCaml )

...