मैं ओकैमल एक्सटेंशन पॉइंट्स के बारे में अधिक जानने की कोशिश कर रहा हूं और मुझे एएसटी में रिकॉर्ड प्रकारों के प्रतिनिधित्व के बाद परेशानी हो रही है।ओकैमल एएसटी रिकॉर्ड प्रकार का प्रतिनिधित्व
मैं इस ब्लॉग पोस्ट से नीचे दिए गए उदाहरण चोरी कर रहा हूँ:
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"
[
...
]
मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं। pexp_desc एएसटी का वास्तविक विवरण है (यह एक बड़ा योग प्रकार है)। -dsourcetree केवल एक योजनाबद्ध प्रतिनिधित्व है, एएसटी के वास्तविक ओकैम मूल्य नहीं। – Drup