ユーザの設定に基づいて関数節を動的に生成する必要があります。動的に関数節を生成する
@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}
それはかなり動作しますしかし、私は何かを単純に欠けて、ものを過度に複製していると思う。だから私の質問は:
コンパイル時に関数節を生成する簡単な方法はありますか?
コンパイル時に関数節を生成する良い例は、次のとおりです。https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/base.ex lines 95-114 –
@DavidWhitlockこれは、トップレベル_に多くの関数宣言を生成する例ですが、私が求めていることとは何の関係もありません。私は別の 'def'sを生成することに問題はありません。 – mudasobwa