2016-05-15 3 views
1

次のコードで2つのマクロを定義しようとしていますが、それは** (CompileError) iex:12: undefined function name/0で失敗しました。 関数ブロックnameはdoブロック内で引用符で囲まれません。defmacroです。エリクシール:リストを変数として使用して複数のマクロを定義する方法は?

この理由は何ですか? これを解決する方法はありますか?

(エリクサーのバージョンは1.2.5です)

defmodule IEx.MyHelpers do 

    def default_env do 
    __ENV__ 
    end 

    [:functions, :macros] |> Enum.each(fn name -> 
    defmacro unquote(name)(option \\ :all) do 
     import MapSet 
     quote do 
     case unquote(option) do 
      x when x in [:a, :all]  -> __ENV__  |> Map.take([unquote(name)]) 
      x when x in [:d, :default] -> default_env |> Map.take([unquote(name)]) 
      x when x in [:i, :imported] -> 
      difference(new(Map.take(__ENV__, [unquote(name)])), 
         new(Map.take(default_env, [unquote(name)]))) 
      |> MapSet.to_list 
     end 
     end 
    end 
    end) 

end 

答えて

3

ダイナミックマクロ世代はすでに暗黙のマクロですので、基本的には、二回UNQUOTEする必要があります。 defmacroの先頭に次の行を追加しても問題ありません。

name = unquote(name) 
関連する問題