【发布时间】:2018-06-10 07:51:19
【问题描述】:
我在宏中有以下定义:
defmacro route(pattern, options \\ [], block) do
name = "my_fun"
def unquote(name)(var!(conn)) do
unquote(block)
end
end
我正在用这个函数调用宏:
route "/" do
conn
|> put_resp_content_type("text/plain")
|> send_resp(200, "Hello, world!")
内部块返回一个%Plug.Conn{} 结构,但是当我在我的宏中打印unquote(block) 的结果时,我得到[do: %Plug.Conn{}] 我做错了什么? do 关键字列表从何而来?
更大的sn-p
defmacro route(pattern, options \\ [], block) do
name = Keyword.get_lazy(options, :name, fn -> create_name(pattern, options) end)
route = {pattern, name}
quote do
@routes [unquote(route) | @routes]
def unquote(name)(var!(conn)) do
resp = unquote(block)
IO.puts("outside the block, resp is")
IO.inspect(resp)
end
end
end
route "/" do
resp = conn
|> put_resp_content_type("text/plain")
|> send_resp(200, "Hello, world!")
IO.puts("Inside the block, resp is")
IO.inspect(resp)
resp
end
结果
Inside the block, resp is
%Plug.Conn{
adapter: {Plug.Adapters.Cowboy2.Conn, :...},
assigns: %{},
{....SNIP....}
}
outside the block, resp is
[
do: %Plug.Conn{
adapter: {Plug.Adapters.Cowboy2.Conn, :...},
assigns: %{},
{....SNIP....}
}
]
【问题讨论】:
-
尝试在参数列表中将
block更改为do: block。 -
好的,修复它。后续问题:最初是如何工作的??
-
这绝对是太晚了,这是有道理的。
unquote([{:do, AST}])将返回[{do:, parse_the_ast(AST)}]。干杯,晚安
标签: macros elixir metaprogramming