erlang - 如何在 Erlang 预处理器中使用用户定义的宏?

标签 erlang

epp:parse_file/3是什么格式接受预定义的宏?

文档对此有点缺乏:

PredefMacros = macros()  

macros() = [{atom(), term()}]

我理解一个简单的宏我可以做到这一点:
epp:parse_file("code.erl", [], [{DEBUG, 0}]).

但是接受参数的复杂宏呢?假设我有这个宏:
-define(DEBUG(Arg1, Arg2),
    ((fun () ->
      io:format("~p ~p~n", [Arg1, Arg2])
    end)())).

我需要将什么作为第三个参数传递给 epp:parse_file ?

最佳答案

epp:parse_file/3函数预处理和解析 Erlang 源文件。对于预处理,它需要所有的宏定义。
可能有 3 种可能性。

  • 宏可以定义在同一个文件中,或者定义它的 hrl 文件包含在完整路径中。在这种情况下,它会自动解决相同的问题。
  • 宏可以在 hrl 文件中定义。然后可以在第二个参数中指定包含文件的目录。例如:epp:parse_file("test.erl", ["../include"], []).它搜索目录中的所有文件并解析它。
  • 宏可能未定义(或者您可能不希望它在包含目录中搜索)。这将导致表单出现错误。例如
  • {error,{21,epp,{undefined,'YOURSERVER',none}}},
    在这种情况下,您可以在 parse_file 函数本身中指定它。例如
    epp:parse_file("yaws.erl", [], [{'YOURSERVER',yourserver}]).
    

    这将解决宏。

    因此,如果源文件中有宏,则不必发送它。仅当源或包含中不存在(或不想指定目录)时,才可以在函数中指定它

    注意:即使源文件中有它,您也可以发送。但是会有一个元组{error, redefine, 'YOURSERVER'}以抽象的形式。但它将在所有地方用函数中发送的值覆盖。

    编辑:

    从 epp 的代码分析我发现目前无法提供参数。epp 模块无法处理复杂的宏类型。以当前方式传递函数结构是不可能的。

    我已经更改了 epp 文件来处理这种情况。您可以查看 link如果您可以更改 epp 文件(仅添加 3 行)。

    关于erlang - 如何在 Erlang 预处理器中使用用户定义的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16251852/

    相关文章:

    datetime - 如何在 Elixir 中获取上个月

    concurrency - Elixir - 受监督的进程似乎会阻止程序执行

    具有大状态的erlang gen_server

    erlang - Erlang 中的背压是什么?

    c - Erlang enif_alloc_resource 总是段错误

    Erlang Shell 工作目录

    erlang - Erlang 17 中的有趣名称

    erlang - 运行 erlang 应用程序,无需依赖终端

    erlang - 在 ejabberd.yml 文件中配置一些参数

    Erlang的从模块: code and IO distribution