ट्रैक
/
Elixir
Elixir
/
अभ्यास
/
नंबर लीजिए
नंबर लीजिए

नंबर लीजिए

सीखने का अभ्यास

परिचय

प्रोसेस

Elixir में सारा कोड प्रोसेस के अंदर चलता है।

डिफॉल्ट रूप से कोई फंक्शन उसी प्रोसेस में चलता है जहाँ से उसे कॉल किया गया था। जब आपको किसी फंक्शन को साफ़-साफ़ किसी नए प्रोसेस में चलाना हो, तो spawn/1 इस्तेमाल कीजिए:

spawn(fn -> 2 + 2 end)
# => #PID<0.125.0>

spawn/1 एक नया प्रोसेस बनाता है जो दिए गए 0-आर्गुमेंट वाले फंक्शन को चलाता है और एक प्रोसेस आइडेंटिफायर (PID) लौटाता है। यह नया प्रोसेस तब तक जीवित रहेगा जब तक वह फंक्शन चलता रहेगा, और उसके बाद चुपचाप बंद हो जाएगा।

Elixir के प्रोसेस को ऑपरेटिंग सिस्टम के प्रोसेस से अलग समझना चाहिए। Elixir के प्रोसेस बहुत कम मेमोरी और CPU इस्तेमाल करते हैं। ऐसे Elixir ऐप्लिकेशन बनाना बिल्कुल ठीक है जिनमें सैकड़ों Elixir प्रोसेस चलते हों।

संदेश

प्रोसेस आपस में सीधे जानकारी साझा नहीं करते। डेटा साझा करने के लिए प्रोसेस संदेश भेजते और प्राप्त करते हैं।

आप send/2 से किसी भी प्रोसेस को संदेश भेज सकते हैं। send/2 का पहला आर्गुमेंट प्राप्तकर्ता का PID होता है, और दूसरा आर्गुमेंट संदेश।

संदेश किसी भी तरह का हो सकता है। अक्सर वह एटम और टपल से बना होता है। अगर आप जवाब चाहते हैं, तो संदेश में कहीं भेजने वाले का PID भी शामिल कीजिए। अपने मौजूदा प्रोसेस का PID आप self() से ले सकते हैं।

send/2 यह नहीं जाँचता कि संदेश प्राप्तकर्ता तक पहुँचा या नहीं, और न ही यह कि प्राप्तकर्ता अभी जीवित है या नहीं। संदेश प्राप्तकर्ता के मेलबॉक्स में चला जाता है, और उसे तभी पढ़ा जाएगा जब प्राप्तकर्ता खुद संदेश प्राप्त करने को कहे।

receive/1 मैक्रो से मेलबॉक्स में से संदेश पढ़ा जा सकता है। यह एक do ब्लॉक लेता है, जिसमें संदेशों पर पैटर्न मैच किया जा सकता है।

receive do
  {:ping, sender_pid} -> send(sender_pid, :pong)
  :do_nothing -> nil
end

receive/1 मेलबॉक्स में से एक संदेश उठाएगा जो दिए गए किसी भी पैटर्न से मेल खाता हो, और उस पैटर्न के लिए दिया गया एक्सप्रेशन चलाएगा। अगर मेलबॉक्स में कोई संदेश नहीं है, या उसमें से कोई भी संदेश किसी पैटर्न से मेल नहीं खाता, तो receive/1 एक संदेश का इंतज़ार करेगा।

संदेश प्राप्त करने का लूप

अगर आपको एक से ज़्यादा संदेश प्राप्त करने हैं, तो आपको receive/1 को रिकर्सिव तरीके से कॉल करना होगा। एक आम तरीका है एक रिकर्सिव फंक्शन बनाना, जैसे loop नाम का, जो receive/1 को कॉल करता है, संदेश के साथ कुछ करता है, और फिर और संदेशों का इंतज़ार करने के लिए खुद को कॉल करता है। अगर आपको एक receive/1 कॉल से दूसरी कॉल तक कुछ स्थिति ले जानी हो, तो उस loop फंक्शन को एक आर्गुमेंट देकर ऐसा कर सकते हैं।

PIDs

प्रोसेस आइडेंटिफायर अपने आप में एक अलग डेटा टाइप हैं। ये मेलबॉक्स के पते की तरह काम करते हैं: अगर आपके पास किसी प्रोसेस का PID है, तो आप उस प्रोसेस को संदेश भेज सकते हैं। PID आम तौर पर परोक्ष रूप से बनते हैं, यानी नए प्रोसेस बनाने वाले फंक्शनों की रिटर्न वैल्यू के रूप में, जैसे spawn।

निर्देश

आप एक Take-A-Number मशीन के लिए एम्बेडेड सिस्टम लिख रहे हैं। यह बहुत ही सरल मॉडल है। यह लगातार संख्याएँ दे सकती है और बता सकती है कि सबसे अंत में कौन-सी संख्या दी गई थी।

1. मशीन शुरू कीजिए

start/0 फंक्शन को लागू कीजिए। इसे एक नया प्रोसेस बनाना चाहिए और उस प्रोसेस की PID लौटानी चाहिए। नए प्रोसेस को अभी कुछ करने की ज़रूरत नहीं है।

TakeANumber.start()
# => #PID<0.138.0>

ध्यान दीजिए कि हर बार यह कोड चलाने पर PID अलग हो सकती है।

2. मशीन की स्थिति बताइए

मशीन में बदलाव कीजिए ताकि नया बनाया गया प्रोसेस संदेश प्राप्त करने के लिए तैयार हो जाए (एक रिसीव लूप शुरू कीजिए) और उसकी शुरुआती स्थिति 0 हो। यह {:report_state, sender_pid} संदेश प्राप्त कर सके। इन संदेशों के जवाब में इसे अपनी वर्तमान स्थिति (सबसे अंत में दी गई टिकट संख्या) sender_pid को भेजनी चाहिए और फिर आगे के संदेशों का इंतज़ार करना चाहिए।

machine_pid = TakeANumber.start()

# a client sending a message to the machine
send(machine_pid, {:report_state, self()})

# a client receiving a message from the machine
receive do
  msg -> msg
end

# => 0

3. संख्याएँ दीजिए

मशीन में बदलाव कीजिए ताकि यह {:take_a_number, sender_pid} संदेश प्राप्त कर सके। इसे अपनी स्थिति 1 से बढ़ानी चाहिए, नई स्थिति sender_pid को भेजनी चाहिए, और फिर आगे के संदेशों का इंतज़ार करना चाहिए।

machine_pid = TakeANumber.start()

# a client sending a message to the machine
send(machine_pid, {:take_a_number, self()})

# a client receiving a message from the machine
receive do
  msg -> msg
end

# => 1

4. मशीन रोकिए

मशीन में बदलाव कीजिए ताकि यह :stop संदेश प्राप्त कर सके। इसे आगे के संदेशों का इंतज़ार करना बंद कर देना चाहिए।

5. अनपेक्षित संदेशों को अनदेखा कीजिए

मशीन में बदलाव कीजिए ताकि जब उसे कोई अनपेक्षित संदेश मिले, तो वह उसे अनदेखा कर दे और आगे के संदेशों का इंतज़ार करता रहे।

GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Elixir Exercism

नंबर लीजिए शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।