Макросы Эрланга с разной арностью - PullRequest
1 голос
/ 07 октября 2010

Для записи в журнал я хотел иметь возможность макрокомандировать операторы во время компиляции, так что - определите для спасения!

Для флагов моего компилятора я собираю с помощью 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.

1 Ответ

5 голосов
/ 07 октября 2010

Мне лучше написать более полный ответ.

Нет, нет способа проверить фактическое определение макроса, вы можете только проверить, был ли определен макрос с таким именем. И вы можете проверять только имя макроса, но не альтернативные определения макросов с разными арностями. Это пережиток прошлого, до R13B, когда вы могли иметь только одно определение макроса на имя. Новый более точно имитирует функции в модуле.

«Стандартный» способ сделать это - использовать некоторый макрос-флаг, чтобы определить, какой набор макросов / функций использовать. Например:

-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.
...