4

什么格式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

4

1 回答 1

3

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

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

{error,{21,epp,{undefined,'YOURSERVER',none}}},

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

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

这将解决宏。

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

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

编辑:

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

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

于 2013-04-27T14:01:33.543 回答