我一直在研究一个宏来动态生成匿名函数。该函数应该有 2 个子句。当满足保护时,第一个子句返回 TRUE。而第二个是默认值,如果与第一个子句不匹配,它将返回 FALSE。例如:
fn
xfield when xfield > 2 -> true
_ -> false
end
这是我的宏原型(prototype)
defmacro condition_function(field, guard) do
clause1 = quote do: (unquote(field) when unquote(guard) -> true)
clause2 = quote do: (_ -> false)
fun_clauses = clause1 ++ clause2
{:fn, [], fun_clauses}
end
问题是第一个子句永远不匹配。这是我在 Elixir 的 REPL 中用来测试我的宏的输入:
iex(84)> myfield = quote do: xfield
{:xfield, [], Elixir}
iex(85)> myguard = quote do: xfield > 2
{:>, [context: Elixir, import: Kernel], [{:xfield, [], Elixir}, 2]}
iex(86)> myFun = Builder.condition_function(myfield, myguard)
#Function<6.50752066/1 in :erl_eval.expr/5>
iex(87)> myFun.(2)
false
iex(88)> myFun.(5)
false
有什么建议么?
提前致谢,
温贝托
最佳答案
多亏了 slack channel 上的人的帮助和 CoderDennis 的提示,我解决了我的问题。
这是我的一个误解。我不需要使用宏。我只需要一个常规功能。
这是我创建带有保护的匿名函数的函数的最终版本:
def anonym_function(field, constraint) do
clause1 = quote do: (unquote(field) when unquote(constraint) -> true)
clause2 = quote do: (_ -> false)
fun_clauses = clause1 ++ clause2
{fun, _} = Code.eval_quoted({:fn, [], fun_clauses})
fun
end
对不起我的误解:(
关于elixir - 如何使用宏创建带有 guard 的匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37835717/