Будет ли константа, определенная в Parsetree, переопределять константу, определенную в Asttypes? - PullRequest
0 голосов
/ 16 октября 2018

Я обнаружил, что Asttypes и Parsetree оба определены константой типа:

Parsetree:

type constant = 
| Pconst_integer of string * char option 
| Pconst_char of char 
| Pconst_string of string * string option 
| Pconst_float of string * char option 

Asttypes:

type constant = 
| Const_int of int 
| Const_char of char 
| Const_string of string * string option 
| Const_float of string 
| Const_int32 of int32 
| Const_int64 of int64 
| Const_nativeint of nativeint 

и Parsetree откроет модуль Asttypes в ocaml/ parsing / parsetree.mli:

open Asttypes

так будет ли константа, определенная в Parsetree, переопределять константу, определенную в Asttypes?

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

let ()=
 let filename = "/home/wk/prog/LocationTest/c.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
 Printf.printf "%d" buf.lex_buffer_len;
 let a=(List.nth ast 0).pstr_desc in
 match a with
 |Pstr_eval (x,y)->
  match x.pexp_desc with
  |Pexp_constant z->
    match z with 
    |Pconst_integer (x,y)->
     Printf.printf "%d" x;

c.ml имеет только одну строку, определенное число

эта программа не может работать, компилятор говорит мне, что ей нужен тип Asttypes.constant

, если я изменю две последние строки на:

|Const_int q->
   Printf.printf "%d" q;

Работает нормально, и отображается число в c.ml

1 Ответ

0 голосов
/ 16 октября 2018

Он не будет переопределять его, но затеняет.Таким образом, оба типа все еще известны компилятору и все еще существуют, однако, когда вы используете неквалифицированную constant, она будет ссылаться на конструктор типа, определенный в последнем открытом модуле.По сути, оператор open просто разрешает неквалифицированный доступ.Вы по-прежнему можете обращаться к значениям и типам из других модулей, при условии, что вы называете их имена именами модулей, например, Asttypes.constant, Parsetree.constant.То же самое верно для конструкторов, например, Asttypes.Const_int, значений, модулей, классов и других элементов, определенных в модуле.

...