2014-10-16 4 views
72

मुझे एक टेम्पलेट हास्केल फ़ंक्शन variablesInScope :: Q [Name] चाहिए जो दायरे में सभी चर के Name की सूची देता है। टेम्पलेट हास्केल में reify :: Name -> Q Info और lookupValueName :: String -> Q (Maybe Name) जैसे कार्यों को लागू करने के लिए स्पष्ट रूप से यह जानकारी उपलब्ध है।नामस्थान में सभी नामों को सूचीबद्ध करने के लिए टेम्पलेटहस्केल का उपयोग

क्या मैं जिस समारोह में चाहता हूं वह कहीं मौजूद है और मैंने इसे अभी अनदेखा किया है? या इसे आसानी से बनाया जा सकता है?

+2

मैं निश्चित रूप से निश्चित हूं कि आप केवल TH के साथ ऐसा नहीं कर सकते हैं, लेकिन आप एक हैस्केल मॉड्यूल को TH एएसटी के रूप में पार्स करने के लिए 'हैकेल-src-meta' का उपयोग कर सकते हैं। – user2407038

+1

क्या मॉड्यूल को लोड करने के लिए 'क्यू' मोनैड की आईओ सुविधाओं का उपयोग करने की आवश्यकता होगी, और फिर उसे 'हैकेल-src-meta'' पर भेजें? उफ़। साथ ही, विभाजन को अलग-अलग दायरे में उपयोग करने के लिए यह नाम असंबद्ध नहीं कर सकता है। –

+1

हां, आपको वास्तव में फ़ाइल को पढ़ने के लिए आईओ का उपयोग करने की आवश्यकता है। मुझे यकीन नहीं है कि मैं आपका दूसरा कथन समझता हूं - यदि आपको * सभी * नाम मिल रहे हैं तो आपको असंबद्ध करने की आवश्यकता क्यों होगी? आप एक फीचर अनुरोध के लिए टिकट खोल सकते हैं, मुझे संदेह है कि अंतर्निहित तंत्र जो कि शक्तियों को शक्ति देता है, वैसे भी सभी इन-स्कोप नाम उपलब्ध हैं। – user2407038

उत्तर

1

दुर्भाग्यवश, आप इसे TH अकेले नहीं कर सकते हैं। Haskell मॉड्यूल को TH AST के रूप में पार्स करने के लिए haskell-src-meta आज़माएं।

हालांकि मॉड्यूल को लोड करने के लिए Q मोनैड की आईओ सुविधाओं की आवश्यकता होगी।

संदर्भ https://ghc.haskell.org/trac/ghc/ticket/9699#ticket कृपया वर्तमान किसी न किसी तरह कल्पना को देखने के लिए

(1) ModuleInfo बढ़ाएँ ModuleInfo [मॉड्यूल] [नाम], जहां [मॉड्यूल] अभी भी आयात है (reifyModule से प्राप्त) सूची और [नाम] में निर्यात किए गए नामों की मॉड्यूल की सूची शामिल है।

(2) इस मॉड्यूल :: क्यू मॉड्यूल वर्तमान मॉड्यूल का उत्पादन जोड़ें।

(3) शीर्ष लेवल नाम :: क्यू [नाम] वर्तमान मॉड्यूल में बाध्य शीर्ष-स्तर के नामों (दोनों निर्यात और गैर-निर्यातित) की एक सूची का उत्पादन करते हैं जो सुधार के लिए दृश्यमान होंगे।

(4) इस संदर्भ में सुधार करने के लिए दिखाई देने वाले गैर-शीर्ष-स्तर (नेस्टेड) ​​नामों की सूची तैयार करने वाले नेस्टेड नाम :: क्यू [नाम] (बेहतर नाम की आवश्यकता में) जोड़ें।

(5) उपलब्ध होने पर मौजूदा स्प्लिसिंग संदर्भ से तुरंत जुड़े नामों की एक सूची तैयार करने वाले माता-पिता :: क्यू [नाम] (एक बेहतर नाम की आवश्यकता में) जोड़ें। उदाहरण के लिए, foo, bar :: $ (typeSplice) देखेंगे [foo, bar], foo = $ (exprSplice) [foo] देखेंगे, और $ (topLevelDecSplice) देखेंगे []।

(6) वैकल्पिक जोड़ें isTopLevel :: नाम -> क्यू बूल यह पता लगाने के लिए कि क्या नाम शीर्ष स्तर (वर्तमान मॉड्यूल का) है? ऐसा कुछ वैकल्पिक रूप से topLevelNames के माध्यम से खोज कर पूरा किया जा सकता है।

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

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