elixir - 如何使用宏创建带有 guard 的匿名函数?

标签 elixir

我一直在研究一个宏来动态生成匿名函数。该函数应该有 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/

相关文章:

elixir - 如何限制监护人和 Phoenix 的特定操作的权限

multithreading - Go 是否可以在不为每个外部进程启动一个 OS 线程的情况下生成并与外部进程通信?

oauth - Elixir Phoenix 设置和使用环境变量

session - Phoenix框架的Plug.Conn中assign和put_session有什么区别?

elixir - 如何读取 Phoenix/Elixir 中的配置变量?

security - 有没有Elixir的源码分析工具?

erlang - 如何在 Erlang/Elixir 中动态定义函数

elixir - Phoenix : Handle POST request body with Content-Type: application/json

elixir - 测试中没有超时

elixir - Keyword.Merge/3 函数中删除了键