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
?
答案 0 :(得分:3)
epp:parse_file/3函数预处理并解析Erlang源文件。对于预处理,它需要所有宏定义。 可以有3种可能性。
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文件来处理这种情况。如果您可以更改epp文件(仅添加3行),则可以查看此link。