Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 取消引用宏定义的函数的结果_Macros_Elixir - Fatal编程技术网

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])中不需要方括号