Macros 取消引用宏定义的函数的结果
我的宏有以下定义Macros 取消引用宏定义的函数的结果,macros,elixir,Macros,Elixir,我的宏有以下定义 defmacro defverified(sign, body) do {name, _, [param]} = sign quote do def unquote(name)(unquote(param)) do unquote(param) = verify! param unquote(body) end end end 我们验证/1如果验证为正确的参数,则返回其参数 我的函数定义如下 defverified t
defmacro defverified(sign, body) do
{name, _, [param]} = sign
quote do
def unquote(name)(unquote(param)) do
unquote(param) = verify! param
unquote(body)
end
end
end
我们验证/1
如果验证为正确的参数,则返回其参数
我的函数定义如下
defverified toto(p) do
IO.inspect p
end
检查p
的内容是正确的,但函数的返回是my变量的引用形式
iex(3)> res = Toto.toto(1)
1
[do: 1]
iex(4)> res
[do: 1]
是否可以使用一个不带引号的表单来返回我的函数,或者我应该手动将其取消引号?我希望我的函数有以下输出
iex(3)> res = Toto.toto(1)
1
1
iex(4)> res
1
这是因为
do
…end
结构是一种特殊的语法糖。例如,这:
def toto(p) do
IO.inspect p
end
相当于:
def toto(p), do: IO.inspect p
def(toto(p), [do: IO.inspect(p)])
这是因为参数末尾的关键字作为关键字列表传递,相当于:
def toto(p), do: IO.inspect p
def(toto(p), [do: IO.inspect(p)])
由于您的defverified
宏只需要do
块,而不需要其他关键字参数,因此我们可以显式匹配实际的主体:
defmacro defverified(sign, [do: body]) do
...
在执行此操作之前,toto
函数的最后一个形式实际上是:
[do: IO.inspect param]
它将按预期调用
IO.inspect
,但随后返回一个关键字列表而不是普通值。发生这种情况是因为do
..end
构造是一种特殊的语法糖。例如,这:
def toto(p) do
IO.inspect p
end
相当于:
def toto(p), do: IO.inspect p
def(toto(p), [do: IO.inspect(p)])
这是因为参数末尾的关键字作为关键字列表传递,相当于:
def toto(p), do: IO.inspect p
def(toto(p), [do: IO.inspect(p)])
由于您的defverified
宏只需要do
块,而不需要其他关键字参数,因此我们可以显式匹配实际的主体:
defmacro defverified(sign, [do: body]) do
...
在执行此操作之前,toto
函数的最后一个形式实际上是:
[do: IO.inspect param]
这将调用
IO。按预期检查,然后返回一个关键字列表而不是普通值。你比我快了一分钟:)顺便说一下,(签名,[do:body])中不需要方括号。
。你比我快了一分钟:)顺便说一下,(签名,[do:body])中不需要方括号
。