【发布时间】:2017-05-27 17:26:22
【问题描述】:
我需要根据用户的配置动态生成函数子句。为了清楚起见,假设我有一个原子列表:
@atoms ~w|foo bar baz|a
来自,比如说,config.exs。我需要的是生成这个函数(MCVE 过于简单,但它给人的印象是我真正需要什么):
@checker fn
{:foo, _} -> false
{:bar, _} -> false
{:baz, _} -> false
_ -> true
end
我目前正在做的是:
@clauses Enum.map(@atoms, fn tag ->
{:->, [], [[{:{}, [], [tag, {:_, [], Elixir}]}], false]}
end) ++ [{:->, [], [[{:_, [], Elixir}], true]}]
defmacrop checker, do: {:fn, [], @clauses}
它工作得很好,但我希望我把事情复杂化了,错过了一些简单的事情。所以,我的问题是:
有没有一种简单的方法可以在编译时生成函数子句?
【问题讨论】:
-
在编译时生成函数子句的一个很好的例子在这里:github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/…lines 95-114
-
@DavidWhitlock 这是在顶层生成许多函数声明的示例,它与我的要求无关。我生成不同的
defs 没有问题。
标签: macros elixir metaprogramming