2013-03-31 6 views
5

私はcamlp4の引用を含むこのコードを持っています。OCaml ASTをOCamlコードとして印刷

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コードがどのように見えるかを確認するためにデバッグを行うためです。

答えて

5

これは数日前に私が自分に尋ねた質問です。

# #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 =() 
:あなたは(図示最後のコマンドの出力のみで)トップレベルタイプ例えば

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

を有する `Camlp4.PreCast.Printers.OCaml.print_implemを、使用することができ

もう1つの解決策は、探している出力を生成する構文拡張を作成することです。たとえば、Camlp4AstFilterはその入力を無視し、あなたのものを出力として返すので、camlp4of my_filter.cmo -str ''を使用して探しているASTを取得できます。

+0

'Camlp4.PreCast.Printers.OCaml.print_implem'関数は、' str_item'だけで動作します。 'expr'を印刷できる他のプリンタはありますか? –

+1

フックの下で、確かに、それらは 'Printers'インタフェースを通して公開されません。あなたの式を 'let _ = ' str_itemとしてラップするのはどうですか?型については、 'type foo = 'などもできます。 – gasche