具有不同数量的 Erlang 宏
对于我的日志记录,我希望能够在编译时宏化语句,因此 -define 可以解决这个问题!
对于我使用 erlc -DFOO 进行编译的编译器标志,有没有办法让 -ifdef 确定 FOO = ok、FOO/0 和 FOO/1 之间的差异?
-module(foo).
-define(FOO, ok).
-define(FOO(X), io:format("~p~n", [X])).
-export([test_x/1]).
%% i want this to be true iff FOO = ok, not if ?FOO/1 exists
-ifdef(FOO).
test_x(X) ->
?FOO(":) " ++ X).
-else.
test_x(X) ->
?FOO(":( " ++ X).
-endif.
For my logging I wanted the ability to macro out the statements at compile time, so -define to the rescue!
For my compiler flags I'm compiling with erlc -DFOO, is there a way for -ifdef to determine the difference between FOO = ok, FOO/0, and FOO/1?
-module(foo).
-define(FOO, ok).
-define(FOO(X), io:format("~p~n", [X])).
-export([test_x/1]).
%% i want this to be true iff FOO = ok, not if ?FOO/1 exists
-ifdef(FOO).
test_x(X) ->
?FOO(":) " ++ X).
-else.
test_x(X) ->
?FOO(":( " ++ X).
-endif.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我最好写一个更完整的答复。
不,没有办法测试实际的宏定义,您只能测试是否已经定义了具有该名称的宏。并且您只能测试宏名称,而不能测试具有不同参数的替代宏定义。这是 R13B 之前的过去的遗留物,当时每个名称只能有一个宏定义。新的模块更接近地模仿模块中的功能。
执行此操作的“标准”方法是使用一些标志宏来确定要使用哪一组宏/函数。例如:
I had better write a fuller reply.
No, there is no way to test the actual macro definition, you can only test if a macro with that name has been defined. And you can only test on the macro name, not on alternative macro definitions with different arities. This is relic from the past, before R13B, when you could only have one macro definition per name. The new one more closely mimics functions in a module.
The "standard" way of doing it is to use some flag macro to determine which set of macros/functions to use. For example: