【发布时间】:2018-06-10 03:05:19
【问题描述】:
我想定义一个宏,以便我可以将do 块传递给它,并让宏创建一个调用该块的函数,带有参数。我遇到了鸡和蛋的问题,因为下面的代码抱怨 name 没有定义。
defmodule MyMacro do
defmacro greet(do: block) do
quote do
def hello(name), do: unquote(block)
end
end
end
defmodule Test do
import MyMacro
greet do
IO.puts("Hello, #{name}!")
end
end
尝试编译此代码会导致:
(CompileError) iex:6: undefined function name/0
(stdlib) lists.erl:1338: :lists.foreach/2
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(iex) lib/iex/evaluator.ex:250: IEx.Evaluator.handle_eval/5
据我了解,这甚至在它到达我的宏之前就爆炸了,因为 elixir 在调用我的宏之前尝试为 do 块生成一个 AST,但 name 是未定义的。
我的目标是在编译 DSL 后能够调用Test.hello("world")。 Elixir 有可能吗?
【问题讨论】:
标签: macros elixir metaprogramming dsl