2015-12-31 3 views
5

मैं ओकैमल एक्सटेंशन पॉइंट्स के बारे में अधिक जानने की कोशिश कर रहा हूं और मुझे एएसटी में रिकॉर्ड प्रकारों के प्रतिनिधित्व के बाद परेशानी हो रही है।ओकैमल एएसटी रिकॉर्ड प्रकार का प्रतिनिधित्व

मैं इस ब्लॉग पोस्ट से नीचे दिए गए उदाहरण चोरी कर रहा हूँ:

let _ = [%getenv "USER"] 

और उत्पादन ocamlc -dparsetree fool.ml की:

http://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/

स्रोत फ़ाइल (foo.ml) का उपयोग करना :

[ 
    structure_item (test.ml[1,0+0]..[1,0+24]) 
    Pstr_eval 
    expression (test.ml[1,0+8]..[1,0+24]) 
     Pexp_extension "getenv" 
     [ 
      structure_item (test.ml[1,0+17]..[1,0+23]) 
      Pstr_eval 
      expression (test.ml[1,0+17]..[1,0+23]) 
       Pexp_constant Const_string("USER",None) 
     ] 
    ] 

asttypes.mli और parsetree.mli से मैं पार्स का अनुसरण कर सकता हूं पेड़ पैटर्न मिलान

Pexp_constant Const_string("USER",None) 

हालांकि, पार्स पेड़ रिकॉर्ड प्रकारों का प्रतिनिधित्व करता है, तो मैं अब क्या हो रहा है इसका पालन नहीं कर सकता। ऐसा लगता है कि रिकॉर्ड फ़ील्ड्स को उसी क्रम में प्रदर्शित नहीं किया जाता है जो वे टाइप परिभाषा में दिखाई देते हैं और पार्स पेड़ में सभी फ़ील्ड आवश्यक नहीं हैं (या दिखाए गए हैं)।

parsetree.mli से:

type expression = { 
    pexp_desc: expression_desc; 
    pexp_loc: Location.t; 
    pexp_attributes: attributes; 
} 

पार्स पेड़ उत्पादन केवल स्थान और पेलोड को दिखाने के लिए लगता है, लेकिन मैं शायद इस गलत तरीके से पढ़ रहा हूँ।

रिकॉर्ड प्रकारों के लिए मैं एएसटी को सही ढंग से कैसे पढ़ूं? प्रकार अभिव्यक्ति के लिए यह होना चाहिए:

(* record type declaration and pexp_loc field *) 
expression (test.ml[1,0+8]..[1,0+24]) 
    (* pexp_desc field *) 
    Pexp_extension "getenv" 
    [ 
     ... 
    ] 
+1

मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं। pexp_desc एएसटी का वास्तविक विवरण है (यह एक बड़ा योग प्रकार है)। -dsourcetree केवल एक योजनाबद्ध प्रतिनिधित्व है, एएसटी के वास्तविक ओकैम मूल्य नहीं। – Drup

उत्तर

2

ऐसा लगता है आप ASTs का अध्ययन करने और एक्सटेंशन अंक उपयोग करने के लिए आवश्यक उपकरणों याद कर रहे हैं। ये उपकरण ppx_tools हैं जो एलेन फ्रिस द्वारा लिखे गए हैं। इन उपकरणों में से एक को सटीक रूप से एएसटी के ठोस प्रतिनिधित्व का पता लगाने के लिए डिज़ाइन किया गया है, इसका नाम dumpast है। चलो निम्न फ़ाइल ast_record.mli पर लागू:

type card = { 
    name: string; 
    address: string; 
    age: int; 
} 

उत्पादन

ocamlfind ppx_tools/dumpast ast_record.mli   
ast_record.mli 
==> 
[{psig_desc = 
    Psig_type 
    [{ptype_name = {txt = "card"}; ptype_params = []; ptype_cstrs = []; 
     ptype_kind = 
     Ptype_record 
     [{pld_name = {txt = "name"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "string"}, [])}}; 
     {pld_name = {txt = "address"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "string"}, [])}}; 
     {pld_name = {txt = "age"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "int"}, [])}}]; 
     ptype_private = Public; ptype_manifest = None}]}] 
========= 

जो पुष्टि करता है कि रिकॉर्ड लेबल के आदेश संरक्षित है।

संयोग से, मैं आपको इन ppx_tools के स्रोत कोड और शायद यह भी PPX विस्तार LWT के साथ भेज दिया अध्ययन करने के लिए सुझाव देने दें। वे काफी छोटे और बहुत अच्छी तरह से लिखे गए हैं और प्रेरणा का एक अनुशंसित स्रोत हैं।

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