2010-11-01 6 views
10

इस सवाल के रूप में हुई पढ़ सकते हैं उदाहरण के लिएErlang खोल में, कैसे मैं स्वतः अपने सभी रिकॉर्ड परिभाषा हेडर

rr("*.hrl"). 

या इसी तरह की कुछ। वर्तमान में मुझे हर बार टाइप करना होगा जब मैं एक एरलांग खोल शुरू करता हूं और मैं इससे थक रहा हूं और हर समय इसे भूल जाता हूं।

लेकिन यह वास्तव में गलत सवाल था! जो मैं वास्तव में करना चाहता था उसके लिए प्रत्येक शेल नौकरी में मेरे रिकॉर्ड परिभाषा शीर्षलेख पढ़ा जाता है। स्टार्टअप पर चलाने के लिए शैल बिल्ट-इन कमांड के लिए उपयोग नहीं करें। तो मैंने सवाल दिखाने के लिए प्रश्न हेडर बदल दिया कि इसे कैसे पूछा जाना चाहिए था।

उत्तर

13

.erlang साथ समाधान का प्रयास करते समय मैं विशिष्ट rr/1 उपयोग के लिए एक समाधान पर ठोकर खाई

पढ़ने और मुद्रण के लिए कुछ समर्थन नहीं है खोल में रिकॉर्ड। संकलन के दौरान रिकॉर्ड अभिव्यक्तियों का अनुवाद tuple expres- शेरों में किया जाता है। रनटाइम में यह ज्ञात नहीं है कि एक ट्यूपल वास्तव में रिकॉर्ड का प्रतिनिधित्व करता है या नहीं। रनटाइम पर उपलब्ध संकलक द्वारा उपयोग की जाने वाली रिकॉर्ड परिभाषाएं भी नहीं हैं। इसलिए जब संभव हो तो रिकॉर्ड के रूप में रिकॉर्ड सिंटैक्स और प्रिंट टुपल्स को पढ़ने के लिए, रिकॉर्ड परिभाषाओं को खोल स्वयं ही बनाए रखना होगा। पढ़ने, परिभाषित करने, भूलने, लिस्टिंग के लिए खोल आदेश, और प्रिंटिंग रिकॉर्ड नीचे वर्णित हैं। ध्यान दें कि प्रत्येक नौकरी में रिकॉर्ड परिभाषाओं का अपना सेट है। मामलों को सुविधाजनक बनाने के लिए मॉड्यूल में परिभाषा shell_default और user_default (यदि लोड हो) प्रत्येक बार एक नई नौकरी शुरू होने पर पढ़ी जाती है। उदाहरण के लिए, लाइन

-include_lib("kernel/include/file.hrl"). 
user_default को

खोल में आसानी से उपलब्ध file_info की परिभाषा में आता है जोड़ने।

फ़ाइल foo.hrl:

स्पष्टीकरण के लिए मैं कुछ उदाहरण जोड़ने

-record(foo, {bar, baz=5}). 

फ़ाइल: user_default.erl:

$ erl 
Erlang R13B04 (erts-5.7.5) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false] 

Eshell V5.7.5 (abort with ^G) 
1> #foo{}. 
#foo{bar = undefined,baz = 5} 
:

-module(user_default). 
-compile(export_all). 

-include("foo.hrl"). % include all relevant record definition headers here 

%% more stuff probably ... 

खोल में बाहर की कोशिश की सुविधा देता है

→ खोल foo.hrl

0

इसे अपनी होम निर्देशिका में .erlang नामक फ़ाइल में रखें (http://www.erlang.org/documentation/doc-5.2/doc/getting_started/getting_started.html में अनुच्छेद 1.7.1 देखें)।

खोल के आदमी पृष्ठ से::

+0

आरआर() के उदाहरण के लिए मुझे यह काम करने में कठिनाई है। एक के लिए यदि मैंने केवल ऊपर दिए गए अनुसार लाइन को रखा है। सेरंग में यह आरआर/1 नहीं ढूंढता है और मुझे नहीं पता कि मॉड्यूल आरआर/1 को किस परिभाषित किया गया है। दूसरी तरफ मुझे यकीन नहीं है कि यह उपलब्ध होगा सभी खोल नौकरियों में। –

+1

@ पीयर स्ट्रिट्जिंगर: 'आरआर() 'को फ़ंक्शन के रूप में परिभाषित नहीं किया गया है; आप 'local_func/7' फ़ंक्शन के खंड के रूप में इसे' stdlib/shell.erl' में पा सकते हैं। – Zed

+0

@Zed: हाँ यह मेरी समस्या थी और मैं वैसे भी इसे ऑटो कॉल करने का एक तरीका ढूंढ रहा था। मेरे आत्म-उत्तर में कार्यवाही को निधि दें और जब मैं स्टार्टअप पर आवश्यक शेल-इन फ़ंक्शन में किसी अन्य शेल-फ़ंक्शन के बारे में नहीं सोच सकता, तो समस्या के समाधान के लिए समस्या हल हो जाती है। –

2

फ़ाइल .erlang शेल प्रारंभ होने से मूल्यांकन किया जाता है रिकॉर्ड के बारे में जानता है, लेकिन यह नहीं खोल के संदर्भ में मूल्यांकन किया है।इसका अर्थ यह है कि इसमें केवल सामान्य अभिव्यक्तियां हो सकती हैं जिनका मूल्यांकन किया जाता है और शेल कमांड नहीं। दुर्भाग्य से rr() एक शेल कमांड है (यह रिकॉर्ड को पहचानने के लिए स्थानीय खोल डेटा प्रारंभ करता है) ताकि इसका उपयोग .erlang फ़ाइल में नहीं किया जा सके।

उपयोगकर्ता परिभाषित मॉड्यूल user_default है, जो पहले से लोड किया जाना चाहिए, फ़ाइलें जो -include या -include_lib का उपयोग कर रिकॉर्ड परिभाषाएँ शामिल होती हैं, कर सकते हैं, इन रिकॉर्ड परिभाषाओं उसके बाद ही user_default में परिभाषित कार्यों के लिए उपलब्ध हो जाएगा। user_default सामान्य संकलित मॉड्यूल है और इसमें निर्यात किए गए कार्यों को किसी अन्य कार्य के रूप में कहा जाता है ताकि रिकॉर्ड परिभाषाएं खोल के भीतर दिखाई न दें। user_default उपयोगकर्ता को अधिक जटिल कार्यों को परिभाषित करने की अनुमति देता है जिन्हें शैल के भीतर से खोल कमांड के रूप में बुलाया जा सकता है।

संपादित करें:

मैं यहां आंशिक रूप से गलत था। जबकि मैं .erlang के मूल्यांकन के बारे में सही था और user_default में फ़ंक्शंस को कैसे कहा जाता है, मुझे याद किया जाता है कि कैसे user_default.erl रिकॉर्ड परिभाषाओं के लिए खोल स्टार्टअप पर स्कैन किया गया है जो तब खोल के भीतर उपलब्ध हैं। इस बात को इंगित करने के लिए धन्यवाद @ पीटर स्ट्रिट्जिंगर।

+0

क्या आप निश्चित हैं? मैनपेज से पाठ अन्यथा कहता है। यह जांचने के लिए कि मैंने एक छोटा परीक्षण केस स्थापित किया है (http://ideone.com/4Gau5 देखें) जैसा कि ऐसा लगता है कि यह काम करता है। क्या मैं कुछ भूल रहा हूँ? –

+0

नहीं, आपने कुछ भी याद नहीं किया है। मैं कोड की जांच कर रहा था और केवल 'shell_default' और' user_default' में फ़ंक्शंस का उपयोग करके देखा और शैल स्टार्टअप पर स्कैनिंग को याद किया। मी culpa। – rvirding

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