gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:59:25 32 4
gpt4 key购买 nike

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com