5

我有这段代码,其中包含一个camlp4 引用。

let f_name = "my_func"
<:str_item< value $lid:f_name$ a = a * 2 >>

通过运行它之后camlp4of,它会产生这个:

  Ast.StExp (_loc,
    (Ast.ExApp (_loc,
       (Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "=")))),
          (Ast.ExApp (_loc,
             (Ast.ExApp (_loc,
                (Ast.ExId (_loc, (Ast.IdLid (_loc, "value")))),
                (Ast.ExId (_loc, (Ast.IdLid (_loc, f_name)))))),
             (Ast.ExId (_loc, (Ast.IdLid (_loc, "a")))))))),
       (Ast.ExApp (_loc,
          (Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "*")))),
             (Ast.ExId (_loc, (Ast.IdLid (_loc, "a")))))),
          (Ast.ExInt (_loc, "2")))))))

我的问题是,是否有打印生成的 ocaml 代码?我应该使用什么camlp4of命令或选项来显示代码?我希望从上面的例子中看到的是:

value my_func a = a * 2

那可能吗?原因是因为我想做一些调试,看看生成的 ocaml 代码是什么样子的。

4

1 回答 1

5

这是我几天前问自己的一个好问题。

您可以使用具有类型的`Camlp4.PreCast.Printers.OCaml.print_implem

value print_implem : ?input_file:string -> ?output_file:string ->
                     Ast.str_item -> unit;

例如,在顶层(仅显示最后一个命令的输出):

# #use "topfind";;
# #require "camlp4";;
# #load "camlp4of.cma";;
# open Camlp4.PreCast;;
# let _loc = Loc.ghost;;
# let test =
    let f_name = "my_func" in
    <:str_item< value $lid:f_name$ a = a * 2 >>;;
# Printers.OCaml.print_implem test;;
let _ = (value my_func a) = (a * 2);;
- : unit = ()

另一种解决方案是制作一个语法扩展,以产生您正在寻找的输出。例如,Camlp4AstFilter 将忽略其输入,并将您的内容作为输出返回,因此您可以使用它camlp4of my_filter.cmo -str ''来获取您正在寻找的 AST。

于 2013-03-31T10:33:11.570 回答