2011-02-02 12 views
19

अन्य भाषाओं में से मैं प्रोग्राम में, मुझे श्रेणियां रखने के लिए उपयोग किया जाता है। पायथन में, यदि मैं सभी नंबरों को 100 तक चाहता हूं, तो मैं range(1, 101) लिखता हूं। इसी तरह, हास्केल में मैं [1..100] लिखूंगा और स्कैला में मैं 1 to 100 लिखूंगा।एरलांग में रेंज

मुझे सिंटैक्स या लाइब्रेरी में एरलांग में कुछ समान नहीं मिल रहा है। मुझे पता है कि यह खुद को लागू करने के लिए काफी सरल होगा, लेकिन मैं यह सुनिश्चित करना चाहता था कि यह पहले कहीं और अस्तित्व में न हो (विशेष रूप से एक मानक पुस्तकालय या भाषा कार्यान्वयन अधिक कुशल लोड होगा)।

क्या एरलांग भाषा या मानक पुस्तकालय में श्रेणियां करने का कोई तरीका है? या क्या कुछ मुहावरे है जो मुझे याद आ रही है? मैं सिर्फ यह जानना चाहता हूं कि मुझे इसे स्वयं लागू करना चाहिए या नहीं।

मैं इस संभावना के लिए भी खुला हूं कि मुझे एरलांग में एक श्रेणी का उपयोग नहीं करना चाहिए (मैं एरलांग में पायथन या हास्केल को कोड नहीं करना चाहता)। इसके अलावा, अगर मैं इस अपने आप को लागू करने के लिए, यदि आप प्रदर्शन सुधारने के लिए कोई अच्छा सुझाव है की क्या ज़रूरत है, मैं उन्हें यह जानकर प्रसन्नता होगी :)

+0

यह कहना मुश्किल है कि आप गलत काम कर रहे हैं या नहीं। आपने केवल इतना कहा है कि आप कुछ करने की कोशिश कर रहे हैं, न कि आप क्या करने की कोशिश कर रहे हैं। – Dustin

+0

@ डस्टिन मुझे लगता है कि मेरा क्या मतलब है मैं जानना चाहता हूं कि मैं ऐसा नहीं सोच रहा हूं कि मुझे एर्लांग में होना चाहिए। –

+0

बिलकुल बताते हुए, सूचियां: seq/2 जाने का रास्ता है! मैं आमतौर पर सूचियों मॉड्यूल को देखने की सिफारिश कर सकता हूं, यह वास्तव में बहुत ही शक्तिशाली है। ओह, और http://www.erldocs.com पर जाएं –

उत्तर

45

http://www.erlang.org/doc/man/lists.html से यह लग रहा है lists:seq(1, 100) की तरह तुम क्या चाहते है। इसके बजाय आप उस श्रेणी में सभी विषम संख्याओं को प्राप्त करने के लिए lists:seq(1, 100, 2) जैसी चीजें भी कर सकते हैं।

+0

सूचियां: seq/2 सबसे अच्छी विधि है। – BlackMamba

8

आप list:seq(From, TO) कि के @bitilly कहना उपयोग कर सकते हैं, और भी आप सूची comprehensions उपयोग कर सकते हैं और अधिक कार्यक्षमता जोड़ने के लिए, उदाहरण के लिए: Erlang में seq:

1> [X || X <- lists:seq(1,100), X rem 2 == 0]. 
[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42, 
44,46,48,50,52,54,56,58|...] 
2

रूबी में सीमा और सूची के बीच एक अंतर है। रूबी की रेंज सूची नहीं बनाती है और अगली विधि पर भरोसा करती है, इसलिए (1.। विशाल इंटेगर)। प्रत्येक {...} स्मृति को नहीं खाएगा। Erlang सूचियां: seq सूची बना देगा (या मुझे विश्वास है कि यह होगा)। तो जब साइड इफेक्ट्स के लिए रेंज का उपयोग किया जाता है, तो इससे कोई फर्क पड़ता है।

पीएस न सिर्फ साइड इफेक्ट के लिए:

(1..HugeInteger).inject(0) { |s, v| s + v % 1000000 == 0 ? 1 : 0 } 

प्रत्येक के रूप में एक ही तरह से काम करेंगे, एक सूची बनाने के लिए नहीं। इसके लिए Erlang रास्ता एक पुनरावर्ती समारोह बनाने के लिए है। वास्तव में, यह वैसे भी एक गुप्त लूप है।

+0

हाँ, एरलांग का आलसी मूल्यांकन के लिए कोई साधन नहीं है। –

+1

@ राफ यकीन है कि यह करता है! बस मज़ा का प्रयोग करें। –

+0

@ Daniel भाषा के अपने शुरुआती फैसले को अभिशाप। मुझे ट्यूटोरियल में आगे पढ़ना चाहिए। –

1

एरलांग में आलसी धारा का उदाहरण। हालांकि यह एर्लांग विशिष्ट नहीं है, मुझे लगता है कि यह लैम्बडास के साथ किसी भी भाषा में किया जा सकता है। प्रत्येक बार स्ट्रीम उन्नत होने पर नया लैम्ब्डा बनाया जाता है ताकि यह कचरा कलेक्टर पर कुछ तनाव डाल सके।

range(From, To, _) when From > To -> 
    done; 
range(From, To, Step) -> 
    {From, fun() -> range(From + Step, To, Step) end}. 

list(done) -> 
    []; 
list({Value, Iterator}) -> 
    [Value | list(Iterator())]. 

% ----- usage example ------ 

list_odd_numbers(From, To) -> 
    list(range(From bor 1, To, 2)).