Я новичок в ocamlp4.Я читаю блог Джейка Донхама , чтобы начать работу с ним.
Я пытаюсь написать небольшую программу CamlP4, которая получит простой тип:
type t = Foo | Bar | Baz
и сгенерировать функции t_of_string
и t_to_string
.
Следуя коду в блоге , я смогу сопоставить тип с:
let wrap_str_item si =
let _loc = Ast.loc_of_str_item si in
<:str_item< $si$ >>
match wrap_str_item si with
| <:str_item< type $lid:tid$ = $Ast.TySum (_, ors)$ >> ->
Но это не работает.Когда я смотрю на AST с помощью campl4of xx.ml -printer o
и уменьшаю его до интересной части:
(Ast.TyDcl (_, tid, [],
(Ast.TySum (_,
(Ast.TySum (_, ors)))), [])
Но мне нужно сопоставить что-то вроде
(Ast.TyDcl (_loc, "t", [],
(Ast.TySum (_loc,
(Ast.TyOr (_loc,
(Ast.TyOr (_loc, (Ast.TyId (_loc, (Ast.IdUid (_loc, "Foo")))),
(Ast.TyId (_loc, (Ast.IdUid (_loc, "Bar")))))),
(Ast.TyId (_loc, (Ast.IdUid (_loc, "Baz")))))))),
[]))
Это похоже на AST вслучай совпадения имеет поддельное TySum
, но я не смог от него избавиться.
У кого-нибудь есть решение для этого?