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

时间:2013-04-27 11:58:51

标签: 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

1 个答案:

答案 0 :(得分:3)

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

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

    在这种情况下,您可以在parse_file函数本身中指定它。例如

    epp:parse_file("yaws.erl", [], [{'YOURSERVER',yourserver}]).
    

    这将解析宏。

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

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

    修改

    从epp的代码分析中我发现目前无法给出参数.epp模块无法处理复杂的宏类型。目前的方式无法传递函数结构。

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