首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >灵丹妙药:如何使用一个列表作为变量定义多个宏?

灵丹妙药:如何使用一个列表作为变量定义多个宏?
EN

Stack Overflow用户
提问于 2016-05-15 09:10:25
回答 1查看 485关注 0票数 1

我试图用下面的代码定义两个宏,但** (CompileError) iex:12: undefined function name/0失败了。函数参数name不能在defmacro的do块中不引用。

原因是什么?有什么办法解决这个问题吗?

(灵丹妙药版本为1.2.5)

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-15 10:12:15

您基本上需要取消引用两次,因为动态宏生成已经是一个隐式宏。您应该可以在defmacro的顶部添加以下行

代码语言:javascript
复制
name = unquote(name)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37236450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档