2014-12-15 3 views
9

iex कंसोल पर, मैं निम्नलिखित त्रुटि है कि मैं अनिश्चित मैं गलत क्या किया है हूँ ...अमृत त्रुटि "erlang त्रुटि: guard_expr"

निम्न त्रुटि में
case %{} do 
    x when x == %{} -> true 
    _x -> false 
end 

परिणाम मिले:

** (ErlangError) erlang error: :guard_expr 

इसके अलावा, मैं यह बताना चाहता था कि मुझे यह कैसे मिला। मैंने elixir के कार्यान्वयन को देखकर और [],, और %{}false और nil के समान व्यवहार करने के लिए इसे बदलने के लिए अपना || मैक्रो बनाने का प्रयास किया।

defmodule Or do 
    defmacro left || right do 
    quote do 
     case unquote(left) do 
     x when x in [false, nil] or x == [] or x == {} or x == %{} -> 
      unquote(right) 
     x -> 
      x 
     end 
    end 
    end 
end 

दूर ले रहा है or x == %{} चीजें काम करता है: https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2313

यहाँ है कि कार्यान्वयन (यह एक ही समस्या है) है।

+1

अजीब। शाब्दिक संकलन के स्थान पर एक चर का उपयोग करना, i.e: 'y =% {}; मामला वाई, करें: (x जब x == y -> true; _x -> false) ' – Christian

+0

हां और इसके एकमात्र मानचित्र जो समस्या का कारण बनते हैं, [] या कुछ और इसे क्रैश नहीं करता है। – mgwidmann

+0

आश्चर्यजनक रूप से, जब यह वही गार्ड फ़ंक्शन परिभाषा में उपयोग किया जाता है तो यह क्रैश नहीं होता है ... – mgwidmann

उत्तर

1

यह एक एरलांग बग प्रतीत होता है। इस मुद्दे को पुन: उत्पन्न करने के लिए एरलांग कोड यहां दिया गया है:

case #{} of X when X == #{} -> X end. 

पुष्टि करने के लिए सभी को धन्यवाद! अधिक जानकारी के लिए टिप्पणियां देखें।