Erlang 21 - 6. Functions

6 कार्य




erlang

6 कार्य

6.1 समारोह घोषणा सिंटेक्स

एक फ़ंक्शन घोषणा , अर्धविराम द्वारा अलग किए गए फ़ंक्शन क्लॉज़ का एक क्रम है, और अवधि (।) द्वारा समाप्त किया जाता है।

एक फ़ंक्शन क्लॉज में एक क्लॉज हेड और एक क्लॉज बॉडी होती है, जिसे -> द्वारा अलग किया जाता है।

एक खंड प्रमुख में फ़ंक्शन का नाम, एक तर्क सूची और कीवर्ड के साथ आरंभ होने वाला एक वैकल्पिक गार्ड अनुक्रम when :

Name(Pattern11,...,Pattern1N) [when GuardSeq1] ->
    Body1;
...;
Name(PatternK1,...,PatternKN) [when GuardSeqK] ->
    BodyK.

फ़ंक्शन नाम एक परमाणु है। प्रत्येक तर्क एक पैटर्न है।

तर्कों की संख्या N फ़ंक्शन की विविधता है। एक फ़ंक्शन विशिष्ट रूप से मॉड्यूल नाम, फ़ंक्शन नाम और एरिटी द्वारा परिभाषित किया गया है। यही है, एक ही नाम के साथ और एक ही मॉड्यूल में दो फ़ंक्शन, लेकिन विभिन्न आकृतियों के साथ दो अलग-अलग फ़ंक्शन हैं।

मॉड्यूल m और f साथ N नाम का एक फंक्शन अक्सर m:f/N रूप में दर्शाया जाता है।

एक खंड शरीर में अल्पविराम (,) द्वारा अलग किए गए भावों का एक क्रम होता है:

Expr1,
...,
ExprN

भावों में मान्य एरलांग अभिव्यक्तियाँ और गार्ड क्रम का वर्णन किया गया है।

उदाहरण:

fact(N) when N>0 ->  % first clause head
    N * fact(N-1);   % first clause body

fact(0) ->           % second clause head
    1.               % second clause body

6.2 समारोह का मूल्यांकन

जब एक फंक्शन m:f/N कहा जाता है, तो फंक्शन के लिए पहला कोड स्थित होता है। यदि फ़ंक्शन नहीं मिल सकता है, तो एक undef रनटाइम त्रुटि होती है। ध्यान दें कि फ़ंक्शन को उस मॉड्यूल के बाहर दिखाई देने के लिए निर्यात किया जाना चाहिए जिसे वह परिभाषित करता है।

यदि फ़ंक्शन पाया जाता है, तो फ़ंक्शन क्लॉज़ को क्रमिक रूप से स्कैन किया जाता है जब तक कि एक क्लॉज नहीं मिलता है जो निम्नलिखित दो दोनों को पूरा करता है:

  • दिए गए तर्कों के खिलाफ क्लॉज हेड के पैटर्न का सफलतापूर्वक मिलान किया जा सकता है।
  • गार्ड अनुक्रम, यदि कोई हो, सच है।

यदि ऐसा क्लॉज नहीं मिल सकता है, तो एक function_clause रनटाइम त्रुटि होती है।

यदि ऐसा क्लॉज पाया जाता है, तो संबंधित क्लॉज बॉडी का मूल्यांकन किया जाता है। यही है, शरीर में अभिव्यक्तियों का क्रमिक रूप से मूल्यांकन किया जाता है और अंतिम अभिव्यक्ति का मूल्य वापस किया जाता है।

फ़ंक्शन fact पर विचार करें:

-module(m).
-export([fact/1]).

fact(N) when N>0 ->
    N * fact(N-1);
fact(0) ->
    1.

मान लें कि आप 1 के लिए भाज्य की गणना करना चाहते हैं:

1> m:fact(1).

मूल्यांकन पहले खंड में शुरू होता है। पैटर्न N का तर्क 1 के खिलाफ मिलान किया जाता है। मिलान सफल होता है और गार्ड ( N>0 ) सत्य है, इस प्रकार N 1 से बँधा होता है, और संबंधित निकाय का मूल्यांकन किया जाता है:

N * fact(N-1) => (N is bound to 1)
1 * fact(0)

अब, fact(0) कहा जाता है, और फ़ंक्शन क्लॉज़ को क्रमिक रूप से फिर से स्कैन किया जाता है। सबसे पहले, पैटर्न N का मिलान 0. से किया जाता है। मिलान सफल होता है, लेकिन गार्ड ( N>0 ) गलत है। दूसरा, पैटर्न 0 के खिलाफ मिलान किया जाता है। मिलान सफल होता है और शरीर का मूल्यांकन किया जाता है:

1 * fact(0) =>
1 * 1 =>
1

मूल्यांकन सफल हुआ है और m:fact(1) रिटर्न 1।

यदि m:fact/1 को ऋणात्मक संख्या के रूप में तर्क के साथ कहा जाता है, तो कोई खंड प्रधान मिलान नहीं होता है। एक function_clause रनटाइम त्रुटि होती है।

6.3 पूंछ पुनरावृत्ति

यदि फ़ंक्शन बॉडी की अंतिम अभिव्यक्ति एक फ़ंक्शन कॉल है, तो एक पूंछ पुनरावर्ती कॉल किया जाता है। यह सुनिश्चित करने के लिए है कि कोई सिस्टम संसाधन, उदाहरण के लिए, कॉल स्टैक का उपभोग नहीं किया जाता है। इसका मतलब है कि अगर यह पूंछ-पुनरावर्ती कॉल का उपयोग करता है तो एक अनंत लूप किया जा सकता है।

उदाहरण:

loop(N) ->
    io:format("~w~n", [N]),
    loop(N+1).

पहले वाला तथ्यात्मक उदाहरण एक प्रति-उदाहरण के रूप में कार्य कर सकता है। यह पूंछ-पुनरावृत्ति नहीं है, क्योंकि पुनरावर्ती कॉल के परिणाम पर fact(N-1) गुणा किया जाता है।

6.4 बिल्ट-इन फ़ंक्शंस (BIFs)

BIF को रनटाइम सिस्टम में C कोड में लागू किया गया है। बीआईएफ उन चीजों को करते हैं जो एर्लैंग में लागू करना मुश्किल या असंभव है। BIF के अधिकांश मॉड्यूल erlang से संबंधित होते हैं, लेकिन कुछ अन्य मॉड्यूल से संबंधित BIF भी होते हैं, उदाहरण के लिए lists और ets

इरलांग erlang(3) से संबंधित सबसे अधिक इस्तेमाल किए जाने वाले बीआईएफ ऑटो-आयातित हैं । उन्हें मॉड्यूल नाम के साथ उपसर्ग करने की आवश्यकता नहीं है। कौन से बीआईएफ जो ऑटो-इम्पोर्टेड हैं, एरल्स erlang(3) मॉड्यूल में ईआरटीएस में निर्दिष्ट हैं। उदाहरण के लिए, मानक प्रकार रूपांतरण बीआईएफ जैसे atom_to_list और गार्ड में अनुमत बीआईएफ को मॉड्यूल नाम निर्दिष्ट किए बिना कहा जा सकता है।

उदाहरण:

1> tuple_size({a,b,c}).
3
2> atom_to_list('Erlang').
"Erlang"

ध्यान दें कि यह आम तौर पर ऑटो-आयातित बीआईएफ का सेट है जिसे 'बीआईएफ' के बारे में बात करते समय संदर्भित किया जाता है।