का उपयोग कर टेम्पलेट हैकेल में गतिशील नाम जेनरेट करें मैं एक टेम्पलेट हैकेल स्प्लिस लिख रहा हूं, और सही प्रकार के 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) पहचानकर्ताओं को उसी इनपुट से, और साथ ही उत्पन्न किया जाता है, और 2) परिभाषाएं निर्यात की जाती हैं। 1 और कुछ के बारे में सोचकर, यह मेरे लिए होता है कि मैं TH के दो टुकड़ों को विलय कर सकता हूं और पूरी तरह से समस्या से छुटकारा पा सकता हूं ... –