Что означает использование Pexp_ident в parsetree.mli? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть эта прога 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 *)

Pexp_ident идет параллельно Pexp_constant, если я напишу parsetreetest2.ml:

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 голосов
/ 20 ноября 2018

Вы не показываете определение для Lident, поэтому очевидный вывод состоит в том, что конструктор не определен, что в точности и говорит вам компилятор.В работающем случае не используется Lident, поэтому в нем нет ошибки.

Похоже, вы работаете с некоторыми уже существующими файлами.Поэтому, возможно, вам нужно посмотреть вокруг и найти определение Lident и убедиться, что оно скомпилировано и может быть найдено компилятором.

Если вы копируете код из другого места, вы можетепосмотрите, есть ли какие-либо объявления open в другом коде.Возможно, объявление open сделает Lident доступным в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...