camp4: Как сопоставить Ast.TySum для получения Ast.TyOr - PullRequest
2 голосов
/ 26 января 2012

Я новичок в 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, но я не смог от него избавиться.

У кого-нибудь есть решение для этого?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Это хорошо известная ошибка, которая была исправлена ​​недавно после 3.12.1 Mantis . Помните, что ваше решение может не работать со следующей версией, в которой исправлена ​​ошибка.

1 голос
/ 27 января 2012

Я наконец нашел решение.Похоже, это синтаксис семенника в ocaml 3.12.1.Замена регистра совпадения на

 <:str_item< type $lid:tid$ = $ors$  >>

будет успешной.

Не знаю, почему, хотя.

...