2013-03-31 12 views
5

Mam ten fragment kodu, który zawiera cytat camlp4.Drukowanie OCaml AST jako OCaml Code

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

Po uruchomieniu tego poprzez camlp4of, produkuje to:

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"))))))) 

Moje pytanie brzmi, czy jest tak, aby wydrukować wygenerowany kod SML? Którego polecenia lub opcji należy użyć, aby wyświetlić kod? Z powyższego przykładu spodziewam się:

value my_func a = a * 2 

Czy to możliwe? Powodem jest to, że chcę zrobić trochę debugowania, aby zobaczyć, jak wygląda wygenerowany kod ocaml.

Odpowiedz

5

To dobre pytanie zadałem sobie kilka dni temu.

Można użyć `Camlp4.PreCast.Printers.OCaml.print_implem który ma typ

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

Na przykład, w Toplevel (tylko wyjście ostatniego polecenia pokazanego):

# #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 =() 

Innym rozwiązaniem jest stworzenie rozszerzenia składni, które wytworzy wynik, którego szukasz. Na przykład Camlp4AstFilter, który po prostu zignoruje dane wejściowe i zwróci twoje dane jako dane wyjściowe, możesz więc użyć numeru camlp4of my_filter.cmo -str '', aby uzyskać AST, którego szukasz.

+0

Funkcja 'Camlp4.PreCast.Printers.OCaml.print_implem' działa tylko na' str_item'. Czy są jakieś inne drukarki, które mogą wydrukować 'wyrażenie? –

+1

Pod hakiem, z pewnością, ale nie są one odsłonięte przez interfejs "Drukarki". Co powiesz na zawijanie wyrażenia jako 'let_ = ' str_item? W przypadku typów można również wpisać "type foo = " itp. – gasche