2016-05-18 10 views
6

का उपयोग कर टेम्पलेट हैकेल में गतिशील नाम जेनरेट करें मैं एक टेम्पलेट हैकेल स्प्लिस लिख रहा हूं, और सही प्रकार के Name एस उत्पन्न करने के लिए संघर्ष कर रहा हूं। अगर मैं एक ज्ञात नाम उत्पन्न करना चाहता हूं (कहें, एक समारोह f), तो मैं 'f का उपयोग कर सकता हूं। इसके लिए f की आवश्यकता होती है जहां मैं स्प्लिस को परिभाषित कर रहा हूं, जहां इसका उपयोग नहीं किया जाता है, जो वास्तव में मैं चाहता हूं।वर्तमान स्कोप

अब मुझे वही चीज़ चाहिए, लेकिन गतिशील नाम के लिए। उदाहरण के लिए, मेरा splice एक तर्क के रूप में n :: Int लेता है। मैं "f" ++ show n को Name के रूप में उत्पन्न करना चाहता हूं, स्प्लिस परिभाषा साइट पर देखा, उपयोग साइट नहीं।

मैंने कुछ विकल्पों का प्रयास किया है: mkName और lookupValueName दोनों को उपयोग साइट पर दायरे में रहने की आवश्यकता है। एकल उद्धरण वाक्यविन्यास को एक शाब्दिक नाम की आवश्यकता होती है, गतिशील नहीं।

अंततः मैंने mkNameG के साथ प्रयोग करना शुरू कर दिया। चूंकि फ़ंक्शंस उसी पैकेज से आते हैं जैसे मैं उनका उपयोग कर रहा हूं, मैंने पैकेज नाम से शुरुआत की, लेकिन इससे Can't find interface-file declaration for variable the-package-name:Some.Module.f0 त्रुटियां मिलीं। कुछ स्रोत पढ़ने के बाद मुझे उन स्थानों को मिला जहां पैकेज नाम "main" का उपयोग किया गया था। ऐसा लगता है कि जीएचसीआई में काम करता है, लेकिन संकलन करते समय भी मुझे एक ही त्रुटि मिलती है।

क्या ऐसा करने का कोई तरीका है? मैं निश्चित रूप से सभी विकल्पों की गणना कर सकता हूं, लेकिन मैं इससे बचना चाहता हूं, क्योंकि इस अभ्यास का पूरा बिंदु कोड को और अधिक गतिशील बनाना है।

उत्तर

1

मुझे लगता है कि आप किसी विशेष Name'f0 से पैकेज नाम निकालने के द्वारा ऐसा कर सकते हैं, फिर इसे mkNameG_v पर पास कर सकते हैं।

  • 'f चेकों लेखन कि पहचानकर्ता f वास्तव में, दायरे में है आप mkNameG के लिए कुछ भी गुजरती हैं और नहीं कर सकते हैं, जबकि जब तक आप Name में इस्तेमाल करने की कोशिश में त्रुटि मिली: यह दो कारणों से एक अच्छा विचार नहीं हो सकता है कुछ रास्ता जब आप Name का उपयोग करते हैं तो आप केवल Name एस पहचानकर्ताओं के लिए Name एस को पहचानने के लिए सुनिश्चित करेंगे, या recover त्रुटि (जब तक कि आप केवल उस त्रुटि के साथ जीएचसी विफल नहीं होने देना चाहते हैं)।

  • लेखन 'ff के उपयोग के रूप में भी गिना जाता है। अप्रयुक्त अप्रत्याशित परिभाषाओं को आसानी से त्याग दिया जाता है, इसलिए आप उन्हें mkNameG के साथ संदर्भित नहीं कर पाएंगे। आपको यह सुनिश्चित करने के लिए कुछ और तरीका ढूंढना होगा कि आपके "f" ++ show n पहचानकर्ताओं का उपयोग किया जाता है।

+0

धन्यवाद, यह बहुत अच्छा काम करता है! आपके द्वारा उल्लिखित दो समस्याएं वास्तव में मेरे मामले में समस्याग्रस्त नहीं हो सकती हैं, क्योंकि: 1) पहचानकर्ताओं को उसी इनपुट से, और साथ ही उत्पन्न किया जाता है, और 2) परिभाषाएं निर्यात की जाती हैं। 1 और कुछ के बारे में सोचकर, यह मेरे लिए होता है कि मैं TH के दो टुकड़ों को विलय कर सकता हूं और पूरी तरह से समस्या से छुटकारा पा सकता हूं ... –

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