2010-10-06 6 views
1

Pour ma journalisation, je voulais avoir la possibilité de macro les instructions au moment de la compilation, donc -define à la rescousse!Macros Erlang avec une arité différente

Pour les drapeaux de mon compilateur je compile avec erlc -DFOO, y a-t-il un moyen pour -ifdef de déterminer la différence entre FOO = ok, FOO/0, et 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. 
+1

Non, impossible de tester la définition de macro. – rvirding

Répondre

5

Je ferais mieux d'écrire une réponse plus complète.

Non, il n'y a aucun moyen de tester la définition de macro réelle, vous pouvez seulement tester si une macro avec ce nom a été définie. Et vous ne pouvez tester que sur le nom de la macro, pas sur d'autres définitions de macros avec des arités différentes. Ceci est une relique du passé, avant R13B, lorsque vous ne pouviez avoir qu'une définition de macro par nom. Le nouveau imite de plus près les fonctions d'un module. Le moyen "standard" de le faire est d'utiliser une macro de drapeau pour déterminer quel ensemble de macros/fonctions à utiliser. Par exemple:

-ifdef(DEBUG). 

-define(DEBUG_PRINT(X), <... something long here ...>). 
foo(X) -> <... debuggy stuff here ...>. 

-else 

-define(DEBUG_PRINT(X), ok). 
foo(X) -> <... normal stuff here ...>. 

-endif. 
Questions connexes