2016-02-04 6 views
10

एलिक्सीर पिछले 18 महीनों के लिए मेरी गोटो भाषा रही है, हालांकि मुझे कभी-कभी लगता है कि "नो जादू" मंत्र (विशेष रूप से फीनिक्स बनाम रेल के संदर्भ में उद्धृत) और मैक्रोज़ के उपयोग के बीच तनाव है।क्या यह देखने का कोई आसान तरीका है कि एलीक्सिर मैक्रो क्या फैलता है?

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

क्या मैक्रोज़ का विस्तार करने और उनके द्वारा जेनरेट किए गए कोड को देखने का एक आसान तरीका है (शायद आईईएक्स के माध्यम से) ताकि मुझे डिफैक्रो की परतों को मेरे सिर में एक साथ टुकड़े करने की कोशिश करने की आवश्यकता न हो।

उत्तर

10

आप Macro.expand/2

iex> Macro.expand((quote do: (if true, do: 1)), __ENV__) 
{:case, [optimize_boolean: true], 
[true, 
    [do: [{:->, [], 
    [[{:when, [], 
     [{:x, [counter: 6], Kernel}, 
     {:in, [context: Kernel, import: Kernel], 
      [{:x, [counter: 6], Kernel}, [false, nil]]}]}], nil]}, 
    {:->, [], [[{:_, [], Kernel}], 1]}]]]} 

का मैक्रो फिर आप Macro.to_string/2 उपयोग कर सकते हैं एक एएसटी के बजाय एक स्ट्रिंग के रूप में उत्पादन प्राप्त करने के लिए विस्तार कर सकते हैं:

iex> Macro.expand((quote do: (if true, do: 1)), __ENV__) |> Macro.to_string() 
"case(true) do\n x when x in [false, nil] ->\n nil\n _ ->\n 1\nend" 

फिर आप IO.puts/2 उपयोग कर सकते हैं मुद्रित करने के लिए टर्मिनल के लिए स्ट्रिंग:

iex> Macro.expand((quote do: (if true, do: 1)), __ENV__) |> Macro.to_string() |> IO.puts() 
case(true) do 
    x when x in [false, nil] -> 
    nil 
    _ -> 
    1 
end 
5

क्रिस मैककॉर्ड से इस चाल का प्रयास करें:

your_ast |> Macro.expand(__ENV__) |> Macro.to_string |> IO.puts 
संबंधित मुद्दे

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