2013-03-31 31 views
5

Ich habe dieses Stück Code, der ein Zitat von camlp4 enthält.Drucken OCaml AST als OCaml Code

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

Danach durch camlp4of einsetzen, dies erzeugt:

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

Meine Frage ist, ist es trotzdem, den generierten Code ocaml zu drucken? Was camlp4of Befehl oder Option sollte ich verwenden, um den Code anzuzeigen? Was ich von dem obigen Beispiel zu sehen erwarte ist:

value my_func a = a * 2 

Ist das möglich? Der Grund ist, weil ich ein Debugging durchführen möchte, um zu sehen, wie der erzeugte OCAML-Code aussieht.

Antwort

5

Das ist eine gute Frage, die ich mir vor ein paar Tagen gestellt habe.

Sie `Camlp4.PreCast.Printers.OCaml.print_implem verwenden können, die den Typen

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

Zum Beispiel hat in dem Top-Level (nur mit dem Ausgang des letzten Befehls angezeigt):

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

Eine andere Lösung besteht darin, eine Syntaxerweiterung zu erstellen, die die Ausgabe produziert, die Sie suchen. Zum Beispiel ein Camlp4AstFilter, der einfach seine Eingabe ignoriert und Ihre Daten als Ausgabe zurückgibt, so dass Sie camlp4of my_filter.cmo -str '' verwenden können, um die AST zu erhalten, die Sie suchen.

+0

Die Funktion 'Camlp4.PreCast.Printers.OCaml.print_implem' arbeitet nur mit' str_item'. Gibt es noch andere Drucker, die Ausdrucke drucken können? –

+1

Unter dem Haken, sicherlich, aber sie sind nicht über die 'Drucker'-Schnittstelle ausgesetzt. Wie wäre es, wenn Sie Ihren Ausdruck einfach als 'let _ = ' str_item? Für Typen können Sie auch 'type foo = ' usw. eingeben. – gasche