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 种可能性。
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/