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

如何在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

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

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

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

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

    epp:parse_file("yaws.erl", [], [{'YOURSERVER',yourserver}]).
    
    这将解析宏

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

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

    编辑:

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


    我已经更改了epp文件来处理这个案件。如果您可以更改epp文件(仅添加3行),则可以检查此项。

    对不起,我的问题不是很清楚。我知道我可以为简单的宏做到这一点,但我不知道如何为带有参数的宏做到这一点。我现在已经更新了。太棒了,谢谢!我想可能是这样的——现在我可以肯定了:)