मेरे पास एक मैक्रो है जो इस तरह के मॉड्यूल को परिभाषित करता है।Elixir macros और bind_quoted
defmodule Bar do
def bar do
IO.puts "I am #{inspect __MODULE__}"
end
end
defmodule MacroFun do
defmacro define_module(name) do
quote do
defmodule unquote(name) do
import Bar
def foo do
bar
IO.puts "I am #{inspect __MODULE__}"
end
end
end
end
end
defmodule Runner do
require MacroFun
def run do
MacroFun.define_module Foo
Foo.foo
end
end
Runner.run
इस चलाने का उत्पादन होता है:
I am Bar
I am Runner.Foo
कौन समझ में आता है; MacroFun.define_module
को Runner.run
में बुलाया गया था इसलिए मॉड्यूल को परिभाषित किया गया था और इस प्रकार Runner
मॉड्यूल के तहत घोंसला गया था।
लेकिन अब अगर मैं बदल MacroFun.define_module
:bind_quoted
विकल्प का उपयोग करने के लिए:
defmacro define_module(name) do
quote bind_quoted: [name: name] do
defmodule name do
import Bar
def foo do
bar
IO.puts "I am #{inspect __MODULE__}"
end
end
end
end
उत्पादन अब हो जाता है:
I am Bar
I am Foo
क्यों ??
वाह, यह बहुत सूक्ष्म है, लेकिन समझ में आता है। यह सुनिश्चित करने के लिए पुन: संक्षेप में कि मैं समझता हूं: जब 'bind_quoted' का उपयोग किया जाता है, तो उद्धरण के शरीर ('do'..'end') को' name' unquoted _outside_ अनदेखा किया जाता है। लेकिन जब 'bind_quoted' का उपयोग नहीं किया जाता है, तो उद्धरण के अंदर' नाम' स्पष्ट रूप से unquoted है। – cjbottaro
ब्रेकिंग बैड से हेज़ेनबर्ग का हवाला देते हुए: "आप सही हैं"। –