2011-05-16 7 views
6

जब किसी मॉड्यूल को डिबग करना (उदा। foo) सूची समझ के साथ अस्थायी फ़ंक्शन नाम उदा।Erlang में सूची समझ के अस्थायी फ़ंक्शन नामों को पढ़ने/डीकोड करने के लिए

foo:'-loop/4-lc$^2/1-3-' 

ट्रेस आउटपुट या त्रुटि संदेशों में पाया जा सकता है। यदि मॉड्यूल में कई सूची समझें होती हैं तो यह पता लगाना मुश्किल होता है कि कौन सा चल रहा है।

फ़ंक्शन का नाम कैसे समझा जा सकता है?

इन कार्यों के कॉल पैरामीटर का क्या अर्थ है?

वापसी मूल्य का अर्थ क्या है?

उत्तर

7

क्षेत्रों का वर्णन किया जा सकता है:

foo:'-loop/4-lc$^2/1-3-' 
^ ^^^ ^^^
1  2 3 4 5 6 7 
  1. मॉड्यूल नाम
  2. संलग्नित समारोह
  3. संलग्नित समारोह
  4. मज़ा के प्रकार के arity (में lc = सूची जनरेटर एक सूची समझ, blc = सूची समझ में बाइनरी जनरेटर, lbc = बाइनरी समझ में सूची जनरेटर, fun = मज़ा) समारोह (0 आधारित)
  5. उत्पन्न समारोह
  6. लैम्ब्डा के सूचकांक समारोह

खुले प्रश्न को परिभाषित करने के भीतर समारोह को उठा लिया की arity को परिभाषित करने के भीतर समारोह के

  • सूचकांक: क्या का अर्थ है पैरामीटर और इन कार्यों के वापसी मूल्य?

    एरिंग-प्रश्न मेलिंगलिस्ट पर एक ही प्रश्न के लिए this answer by Robert Virding पर बस ठोकर खाई।


    कोड है जो इन नामों बनाता है कई मॉड्यूल में फैला है: funs के लिए sys_pre_expand; समझ के लिए बनाए गए कार्यों के लिए v3_core; और v3_kernel जो लैम्ब्डा कार्यों को उठाने पर अधिक जोड़ता है। इन सभी का लक्ष्य "अद्वितीय" फ़ंक्शन नाम बनाना है जो कुछ संकेत देते हैं कि फ़ंक्शंस क्यों बनाए गए थे और क्यों।

    %% new_fun_name(State) -> {FunName,State}. 
    
    new_fun_name(#expand{func=F,arity=A,fcount=I}=St) -> 
        Name = "-" ++ atom_to_list(F) ++ "/" ++ integer_to_list(A) 
         ++ "-fun-" ++ integer_to_list(I) ++ "-", 
        {list_to_atom(Name),St#expand{fcount=I+1}}. 
    

    इन नामों पर पारित कर रहे हैं और बाद में पास (v3_kernel) में विस्तार:

    sys_pre_expand.erl में funs के लिए फ़ंक्शन नाम बनाने कोड सामने है।

    compilers v3_core.erl से:

    %% new_fun_name(Type, State) -> {FunName,State}. 
    
    new_fun_name(Type, #core{fcount=C}=St) -> 
        {list_to_atom(Type ++ "$^" ++ integer_to_list(C)),St#core{fcount=C+1}}. 
    

    तो यह "नियंत्रण रेखा $^2" (भागों 4 और 5) उदाहरण में के लिए खातों। उन स्थानों को देखते समय जहां इसका उपयोग किया जाता है, भाग 4 के लिए संभावित मानों को घटाया जा सकता है: lc, blc और lbc

    %% new_fun_name(Type, State) -> {FunName,State}. 
    
    new_fun_name(Type, #kern{func={F,Arity},fcount=C}=St) -> 
        Name = "-" ++ atom_to_list(F) ++ "/" ++ integer_to_list(Arity) ++ 
        "-" ++ Type ++ "-" ++ integer_to_list(C) ++ "-", 
        {list_to_atom(Name),St#kern{fcount=C+1}}. 
    

    यह -loop/4- (भागों 2 और 3) और -3- (भाग 7) के लिए खातों:

    v3_kernel.erl में अगले चरण जब इन कार्यों लैम्ब्डा उठा लिया हो रहा है। भाग 6 को new_fun_name/2 पर कॉल में जोड़ा गया है।


    (यह पोस्ट एक समुदाय विकी है अगर आप जानते हैं कि वे क्या मतलब है, कृपया अन्य प्रविष्टियों को जोड़ने)

  • +0

    हम कोड है कि इस उत्पन्न करता है पर गौर करना चाहिए ... –

    +0

    सामान्य रूप में funs में शामिल रहे हैं, तो उपर्युक्त विवरण, 'मजेदार' एक वैध प्रकार है (सामान्य मज़े के अंदर क्रैश करने का प्रयास करें)। –

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