2

私はocamlp4が初めてです。私はそれを始めるためにJake Donham のブログを読んでいます。

次のような単純な型を取得する小さな 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")))))))),
        []))

match ケースの AST に spurious があるようですがTySum、それを取り除くことができませんでした。

誰かがその解決策を持っていますか?

4

2 に答える 2

2

これはよく知られたバグで、 3.12.1Mantis以降に最近修正されました。バグが修正された次のバージョンでは、ソリューションが機能しない可能性があることに注意してください。

于 2012-02-16T22:45:10.350 に答える
1

私は最終的に解決策を見つけました。ocaml 3.12.1 の deferente 構文のようです。マッチケースの交換

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

成功します。

理由はわかりませんが。

于 2012-01-26T22:25:03.703 に答える