2016-02-17 9 views
6

एलिक्सीर भाषा में यादृच्छिक पहुंच के साथ "कॉन्स्ट एरे" बनाने का कैननिक तरीका क्या है? (उदाहरण के एक सीआरसी गणना, या एईएस में इस्तेमाल के लिए स-बक्से)इलीक्सिर में "कॉन्स्ट एरे" के बराबर बनाने के लिए अनुशंसित तरीका क्या है?

Erlang पृष्ठभूमि मुझे लगता है से, कि "सरणी" खुद elem/2/element/2 के माध्यम से एक टपल, उपयोग के रूप में होना चाहिए हे हो रहा है (1) (BIF_RETTYPE element_2(BIF_ALIST_2)erts/emulator/beam/bif.c में फ़ंक्शन 0)।

लेकिन भंडारण के दायरे के बारे में क्या, जैसा कि एरलांग/एलिक्सीर के पास कोई ग्लोबल नहीं है? मेरी नाक कहती है @module_attribute जगह होगी, लेकिन मुझे पूरा यकीन नहीं है कि कहां और कब @attributes का विस्तार किया जाता है।

एक ज्ञात एरलांग समस्या है: जब आप मॉड्यूल में -define(LARGE_LIST,[...]) और फिर कार्यों में ?LARGE_LIST का उपयोग करें। मूल्य प्रत्येक फ़ंक्शन कॉल पर फिर से बनाया जाता है। समाधान शुरू होने पर इसे एक बार निर्माण करना था और पैरामीटर में से एक के रूप में इसे आवश्यक कार्यों को पास करना था।

क्या एलीक्सिर के @module_attribute इस समस्या को हल करते हैं या इसे फैंसी मैक्रो विस्तार के रूप में माना जाता है? मैंने module attributes पर आधिकारिक दस्तावेज़ पढ़े हैं, लेकिन मैं अभी भी उलझन में हूं।

उत्तर

7

प्रलेखन से, ऐसा लगता है कि इलीक्सिर मॉड्यूल विशेषताएँ एरलांग मॉड्यूल विशेषताओं जैसे काम करती हैं, यानी वे मॉड्यूल मेटाडेटा हैं जिन्हें Module:module_info(Attributes) द्वारा पुनर्प्राप्त किया जा सकता है। यह अंततः attributes_for_module में beam_load.c में फ़ंक्शन में जाता है, जहां तक ​​मैं देख सकता हूं कि हर बार जब डेटा एक्सेस किया जाता है तो डेटा कॉपी करता है। इस प्रकार, एक मॉड्यूल विशेषता अक्सर उपयोग किए गए डेटा के एक बड़े टुकड़े के लिए उपयुक्त नहीं होगी।

इसके बजाय, मैं एक ऐसा फ़ंक्शन लिखूंगा जिसमें कोई तर्क नहीं होगा और केवल ट्यूपल लौटाएगा। ट्यूपल को मॉड्यूल के निरंतर पूल में संकलित किया जाएगा, इसलिए इसे हर बार फ़ंक्शन कहलाए जाने पर पुनर्निर्मित नहीं किया जाएगा; समारोह अनिवार्य रूप से निरंतर डेटा का संदर्भ देता है। यह the Erlang Efficiency Guide में "कॉन्स्टेंट पूल" खंड में वर्णित है।

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