2012-10-25 33 views
7

में आदेश देने का क्या ऑपरेटरों =:=, ==, <, >, =<, >= साथ Erlang में कार्यों की तुलना करने के क्या मतलब है? मैं दुभाषिया के साथ खेल रहा था और इन परिणामों को मिला:समारोह समानता/erlang

Eshell V5.9.2 (abort with ^G) 
1> X = fun() -> {} end. 
#Fun<erl_eval.20.82930912> 
2> Y = fun() -> {} end. 
#Fun<erl_eval.20.82930912> 
3> 
3> {X == X, X =:= X}. 
{true,true} 
4> {X >= X, X =< X}. 
{true,true} 
5> {X > X, X < X}. 
{false,false} 
6> 
6> {X == Y, X =:= Y}. 
{true,true} 
7> {X >= Y, X =< Y}. 
{true,true} 
8> {X > Y, X < Y}. 
{false,false} 

यह समझ में आता है। ऐसा लगता है कि यह दो कार्यों के सार वाक्यविन्यास पेड़ की तुलना कर रहा है।

लेकिन इस सत्र में X और Y को एक बार फिर से परिभाषित किया गया है लेकिन अलग हैं, अब भी X<Y?

Eshell V5.9.2 (abort with ^G) 
1> X = fun() -> {} end. 
#Fun<erl_eval.20.82930912> 
2> 
2> {X == X, X =:= X}. 
{true,true} 
3> {X >= X, X =< X}. 
{true,true} 
4> {X > X, X < X}. 
{false,false} 
5> 
5> Y = fun() -> {} end. 
#Fun<erl_eval.20.82930912> 
6> 
6> {X == Y, X =:= Y}. 
{false,false} 
7> {X >= Y, X =< Y}. 
{false,true} 
8> {X > Y, X < Y}. 
{false,true} 

तो यह है कि यह एएसटी या अद्वितीय संदर्भ की किसी भी तरह की तुलना नहीं कर रहा है लग रहा है। शायद यह संदर्भों की तुलना कर रहा है, बस कुछ अनुकूलन हो रहा है और X और Y एक ही संदर्भ के लिए बाध्य हो? यदि इसके लिए कुछ स्पष्टीकरण है, तो विभिन्न वीएम या विभिन्न नोड्स में क्या होता है?

+1

Erlang R15B01 पर मैं '{सच, सच}' '6 में > '। –

+0

R15B02 को '6>> यहां भी' {true, true} 'मिला। – halfelf

+0

R14B02 '{true, true} 'पंक्ति में' 6> 'भी। – Tilman

उत्तर

3

खोल में 2 मूल्यांकन के बीच का अंतर रिक्त रेखा 6> से आता है। यदि आप फ़ंक्शन erlang का उपयोग करके मज़े पर एक नज़र डालते हैं: fun_info/1, आप देखेंगे कि उस स्थिति में, खंड को एक अलग संख्या (यानी 1 के बजाय 2) के साथ संग्रहीत किया जाता है।

यदि आप फिर से वाई (एक खाली रेखा के बिना) की परिभाषा दर्ज करते हैं तो आपको एक खराब मिलान मिलेगा, अगर आप पहले रिक्त रेखा दर्ज करते हैं, तो यह ठीक है।

मुझे लगता है कि यह खोल का उपयोग करने का एक दुष्प्रभाव है, लेकिन यह व्यवहार एक कार्यक्रम के भीतर संगत है। बेशक> या < का अर्थ मजेदार के लिए स्पष्ट नहीं है, लेकिन == हां। एक अच्छी बात यह है कि यह भी Erlang अवधि के आदेश परिभाषित किया जाता है, तो यह उम्मीद के मुताबिक व्यवहार के साथ किसी भी शब्द की एक सूची सॉर्ट करने के लिए संभव है:

number < atom < reference < fun < port < pid < tuple < list < bit string 
+0

मुझे लगता है कि संख्याओं की तुलना करते समय '==' केवल उपयोगी है। – halfelf

+3

@ आधा नहीं, '==' कुछ और सब कुछ की तुलना करने के लिए उपयोगी है। आपको तुलना के अर्थशास्त्र के बारे में अवगत होना चाहिए। मैं कार्यों की गंभीरता से तुलना नहीं करता, ऐसे कई तरीके हैं जिनमें "बराबर" कार्य असमान हो सकते हैं। उदाहरण के लिए यदि आप एएसटी की तुलना करने की अपेक्षा करते हैं तो जागरूक रहें कि एएसटी में लाइन नंबर हैं। – rvirding