我是ocamlp4的新手。我正在阅读Jake Donham's blog以开始使用它。
我正在尝试编写一个小型的CamlP4程序,它将得到一个简单的类型:
type t = Foo | Bar | Baz
并生成t_of_string
和t_to_string
函数。
按照blog上的代码,我应该能够将类型与:
匹配 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)$ >> ->
但这不起作用。当我用campl4of xx.ml -printer o
查看AST并将其缩小到有趣的部分时:
(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
,但我无法摆脱它。
有人有解决方案吗?
答案 0 :(得分:2)
这是一个众所周知的错误,最近在3.12.1 Mantis之后修复了。请注意,您的解决方案可能不适用于已修复错误的下一个版本。
答案 1 :(得分:1)
我终于找到了解决方案。 它似乎是ocaml 3.12.1中的一种语法。 用
替换匹配大小写 <:str_item< type $lid:tid$ = $ors$ >>
会成功。
不确定为什么。