कैसे अंतिम वापसी मान का निर्माण किया है ...
[Msg | important()]
पहली बार के लिए वापस आ जा रहा है, अंतिम वापसी मान के रूप निर्धारित होता है। एकमात्र चिंता यह है कि हम अभी तक अंतिम वापसी मूल्य के सभी विवरण नहीं जानते हैं। तो [Msg | important()]
में important()
का मूल्यांकन जारी रहेगा। निम्नलिखित का एक उदाहरण है कि अंतिम वापसी मूल्य [high,high,low,low]
का निर्माण कैसे किया जाता है।
[high | important( )] <---- Defines the final form
---------------------------------
[high | important( )] <---- Adds more details
------------------------
normal( ) <---- Adds more details
------------------------
[low | normal( )] <---- Adds more details
----------------
[low | normal()] <---- Adds more details
--------
[ ] <---- Adds more details
------------------------------------------
[high | [high | [low | [low | []]]]]
[high,high,low,low] <---- The final return value
कैसे कोड काम करता है ...
समारोह important/0
में, after 0
सीधा सा अर्थ है "संदेश आने के लिए मैं इंतजार नहीं है" - होगा कि मेरे मेलबॉक्स में किसी भी संदेश है, मैं इसे देखेंगे; यदि कोई नहीं है, तो मैं वहां रहने के बजाय (normal()
निष्पादित) जारी रखूंगा।मेलबॉक्स में, {15, उच्च}, {7, निम्न}, {1, निम्न}, {17, उच्च} पहले से ही वहां बैठे हैं। एरलांग में, मेलबॉक्स में संदेश पहले आओ-प्रथम-सेवा क्रम में कतारबद्ध नहीं हैं। receive
खंड picky हो सकता है। यह मेलबॉक्स में सभी संदेशों के माध्यम से स्कैन करता है और जो चाहती है उसे "चुनता है"। हमारे मामले में, {15, उच्च} और {17, उच्च}{Priority, Msg} when Priority > 10
के अनुसार पहले उठाया गया। उसके बाद, फ़ंक्शन normal/0
लेता है। और {7, कम}, {1, कम} क्रमशः संसाधित (consed) प्राप्त करें। अंत में, हमें [high,high,low,low]
मिला।
एक संशोधित संस्करण है कि प्रसंस्करण आदेश का पता चलता है ...
हम आदेश प्रसंस्करण (consing) क्रम अधिक स्पष्ट बनाने के लिए कोड एक छोटा सा संशोधित कर सकते हैं:
-module(prior).
-compile(export_all).
important() ->
receive
{Priority, Msg} when Priority > 10 ->
[{Priority, Msg} | important()] % <---- Edited
after 0 ->
normal()
end.
normal() ->
receive
{Priority, Msg} -> % <---- Edited
[{Priority, Msg} | normal()] % <---- Edited
after 0 ->
[]
end.
भागो खोल में यह:
4> c(prior).
{ok, prior}
5> self() ! {15, high}, self() ! {7, low}, self() ! {1, low}, self() ! {17, high}.
{17,high}
6> prior:important().
[{15,high},{17,high},{7,low},{1,low}]
concatenated नहीं, consed। concatenation तब होता है जब आपके पास दो सूचियां होती हैं, 'L1' और 'L2' और उन्हें संयोजित करें:' L1 ++ L2'। खपत तब होती है जब आपके पास तत्व 'ई' और एक सूची' एल' होती है और फिर विस्तारित सूची '[ई | एल] '। –