Próbuję dowiedzieć się więcej o punktach rozszerzeń OCaml i mam problemy z reprezentacją typów rekordów w AST.OCaml reprezentacja typu rekordu AST
jestem kradzież poniżej przykład z tego blogu:
http://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/
Korzystanie z pliku źródłowego (foo.ml):
let _ = [%getenv "USER"]
i wyjściowe ocamlc -dparsetree fool.ml :
[
structure_item (test.ml[1,0+0]..[1,0+24])
Pstr_eval
expression (test.ml[1,0+8]..[1,0+24])
Pexp_extension "getenv"
[
structure_item (test.ml[1,0+17]..[1,0+23])
Pstr_eval
expression (test.ml[1,0+17]..[1,0+23])
Pexp_constant Const_string("USER",None)
]
]
Z asttypes.mli i parsetree.mli Mogę śledzić parsowanie dopasowanie wzoru drzewa do linii
Jednak nie mogę już śledzić, co się dzieje, gdy drzewo analizy reprezentuje typy rekordów. Wydaje się, że pola rekordów nie są reprezentowane w takiej samej kolejności, w jakiej pojawiają się w definicji typu, a nie wszystkie pola są wymagane (lub pokazane) w drzewie analizy.
Od parsetree.mli:
type expression = {
pexp_desc: expression_desc;
pexp_loc: Location.t;
pexp_attributes: attributes;
}
Wyjście drzewo parse wydaje się tylko, aby pokazać lokalizację i ładowność, ale ja pewnie czytając to nieprawidłowo.
Jak poprawnie odczytać AST dla typów rekordów? Dla wyrażenia typu powinno być:
(* record type declaration and pexp_loc field *)
expression (test.ml[1,0+8]..[1,0+24])
(* pexp_desc field *)
Pexp_extension "getenv"
[
...
]
Nie jestem pewien, czy rozumiem twoje pytanie. pexp_desc to rzeczywisty opis AST (jest to typ o dużej wartości). -dsourcetree jest tylko schematyczną reprezentacją, a nie rzeczywistą wartością OCaml AST. – Drup