2013-03-31 10 views
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 

क्या यह संभव है? इसका कारण यह है कि मैं यह देखने के लिए कुछ डिबगिंग करना चाहता हूं कि उत्पन्न ओकंपल कोड कैसा दिखता है।

उत्तर

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 '' का उपयोग कर सकें।

+0

फ़ंक्शन 'Camlp4.PreCast.Printers.OCaml.print_implem' केवल' str_item' पर काम करता है। क्या कोई अन्य प्रिंटर है जो 'एक्सप्र' प्रिंट कर सकता है? –

+1

हुक के तहत, निश्चित रूप से, लेकिन वे 'प्रिंटर' इंटरफ़ेस के माध्यम से प्रकट नहीं हुए हैं। बस अपनी अभिव्यक्ति को 'let _ = ' str_item के रूप में लपेटने के बारे में क्या? प्रकारों के लिए आप 'foo = ' इत्यादि भी कर सकते हैं। – gasche

संबंधित मुद्दे