2016-01-28 8 views
9

मैं कुछ एरलांग कोड में आया हूं जो मैं दोनों भाषाओं को सीखने और मतभेदों को समझने में मदद करने के लिए एलिक्सीर में परिवर्तित करने की कोशिश कर रहा हूं। सामान्य रूप से मैक्रोज़ और मेटाप्रोग्रामिंग एक विषय है जो मैं अभी भी अपने सिर को पाने की कोशिश कर रहा हूं, इसलिए उम्मीद है कि आप मेरी भ्रम को समझेंगे।एरलांग बनाम एलिक्सीर मैक्रोज़

Erlang कोड

-define(p2(MAT, REP), 
     p2(W = MAT ++ STM) -> m_rep(0, W, STM, REP)) 

% where m_rep is a function already defined. 
मेरे लिए

, ऐसा लगता है उपरोक्त कोड में, वहाँ p2 मैक्रो है कि एक निजी समारोह m_rep कहा जाता है के लिए नक्शे के दो अलग-अलग परिभाषाएं है। हालांकि एलिक्सिर में, ऐसा लगता है कि एक पैटर्न मिलान परिभाषा केवल संभव है। क्या एलिक्सिर में भी अलग-अलग होना संभव है?

+2

मुझे नहीं पता कि आप सी और लिस्प से परिचित हैं, लेकिन एक साधारण सादृश्य यह होगा कि एरलांग के मैक्रोज़ सी मैक्रोज़ (यह सरल संकलन समय स्ट्रिंग प्रतिस्थापन है) की तरह हैं और एलिक्सीर मैक्रोज़ लिस्प मैक्रोज़ की तरह हैं (यह कोड है जो एएसटी में हेरफेर कर सकते हैं)। –

+0

@OnorioCatenacci यह बहुत दिलचस्प है! मुझे समझने में मदद के लिए बहुत बहुत धन्यवाद। :-) – plotplot

उत्तर

6

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

?p2("a", "b"); 
?p2("c", "d"). 

ऊपर विस्तार किया जाएगा करने के लिए:

p2(w = "a" ++ stm) -> m_rep(0, w, stm, "b"); 
p2(w = "c" ++ stm) -> m_rep(0, w, stm, "d"). 

आप erlc -P का प्रयोग कर एक .P फ़ाइल है कि आप पर मैक्रो विस्तार के प्रभाव दिखाएगा निर्माण करने के लिए कर सकते हैं अपने कोड।

-module(macro). 
-export([foo/1]). 

-define(foo(X), 
     foo(X) -> X). 

?foo("bar"); 
?foo("baz"); 
?foo("qux"). 

erlc -P macro.erl का उपयोग करके आप macro.P के लिए निम्न उत्पादन मिल जाएगा: यह थोड़ा सरल, compilable उदाहरण देखें

-file("macro.erl", 1). 

-module(macro). 

-export([foo/1]). 

foo("bar") -> 
    "bar"; 
foo("baz") -> 
    "baz"; 
foo("qux") -> 
    "qux". 

अमृत में आप कई समारोह खंड मैक्रो का उपयोग कर के रूप में अच्छी तरह से परिभाषित कर सकते हैं। यह अधिक verbose है, लेकिन मुझे लगता है कि यह भी बहुत स्पष्ट है। अमृत ​​बराबर होगा:

defmodule MyMacros do 
    defmacro p2(mat, rep) do 
    quote do 
     def p2(w = unquote(mat) ++ stm) do 
     m_rep(0, w, stm, unquote(rep)) 
     end 
    end 
    end 
end 

जो आपने अभी erlang समकक्ष की तरह, कई समारोह खंड परिभाषित करने के लिए उपयोग कर सकते हैं:

defmodule MyModule do 
    require MyMacros 

    MyMacros.p2('a', 'b') 
    MyMacros.p2('c', 'd') 
end 
+1

आपने मुझे बहुत कुछ सिखाया है। इस तरह के एक विस्तृत उत्तर के लिए धन्यवाद। – plotplot

2
-define(p2(MAT, REP), 
     p2(w = MAT ++ stm) -> m_rep(0, w, stm, REP)) 

% where m_rep is a function already defined. 

ऊपर कोड मुद्दों की एक संख्या है।

एरलांग में कई खंडों के साथ मैक्रो जैसी कोई चीज़ नहीं है। उपर्युक्त कोड p2 मैक्रो की दो अलग-अलग परिभाषाओं को परिभाषित नहीं करता है जो m_rep नामक एक निजी फ़ंक्शन पर नक्शा लगाता है। यह क्या करता है यह 2-तर्क मैक्रो को परिभाषित करता है, जो p2 फ़ंक्शन को कुछ मानकों को लेता है और m_rep पर कॉल करता है। हालांकि, आंतरिक p2 समारोह के पैरामीटर परिभाषा गलत है:

  • यह दूसरा तर्क एक सूची
  • यह (एक परमाणु को कोई मान निर्दिष्ट करने के लिए आप एक राजधानी मतलब था की कोशिश करता है नहीं किया जा रहा के साथ ++ उपयोग करने के लिए कोशिश करता है W, एक चरम w, एक परमाणु के बजाय एक चर?)
  • यह एक ऐसे स्थान पर असाइनमेंट की कोशिश करता है जहां एक असाइनमेंट की अनुमति नहीं है - फ़ंक्शन हेड में।

क्या आपने असाइनमेंट करने के लिए समानता (=== के बजाय) परीक्षण करने का प्रयास किया था? यदि हां, तो आपको एक गार्ड का उपयोग करना होगा।

इसके अलावा, ऐसा लगता है कि आप w और stm का उपयोग करने की कोशिश कर रहे हैं जैसे कि वे चर थे और उन्हें m_rep पर पास कर दिया गया, लेकिन वे नहीं हैं! एरलांग में चर को पूंजी पत्र से शुरू करना है। दूसरी तरफ, एलिक्सीर में चर, नहीं। हो सकता है कि आप दो समान लेकिन अभी भी अलग-अलग भाषाओं से अवधारणाओं को भ्रमित कर रहे हों।

मेरी सामान्य सलाह एक भाषा चुनना और इसे अच्छी तरह से सीखना होगा और बाद में केवल उस ज्ञान के साथ आपके बेल्ट के नीचे एक अलग भाषा आज़माएं। अगर आप प्रोग्रामिंग के लिए पूरी तरह से नए हैं तो Erlang चुनें - यह आसान है, आगे सीखने के लिए कम चीजें हैं। यदि आप पहले से ही रूबी को जानते हैं या अपने कौशल की तत्काल विपणन क्षमता में हैं तो Elixir चुनें।

कृपया अपने इरादे के बारे में और जानें और मैं इसे व्यक्त करने वाले कोड के साथ आ सकता हूं। उपरोक्त स्निपेट बहुत संदिग्ध है।

+0

आप चर नामों के बारे में सही थे। भ्रम के लिए माफी माँगती है! – plotplot

3

मैं यहां अपनी सहायता नहीं कर सकता। :-) यदि मैक्रोज़ है तो आप LFE (Lisp Flavoured Erlang) का उपयोग कर अधिक या तो एरलांग या इलीक्सिर से बेहतर मैक्रो हैंडलिंग करते हैं। यह दोनों के साथ संगत है।

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