The Preprocessor
?MODULE, ?MODULE_STRING, ?FILE, ?LINE, ?FUNCTION_NAME, ?FUNCTION_ARITY, ?MACHINE, ?OTP_RELEASE, ?FEATURE_AVAILABLE(F), ?FEATURE_ENABLED(F).
18.1 Macros
-define(TIMEOUT, 5000).
-define(SQUARE(X), ((X) * (X))).
-define(LOG(Msg, Args), io:format("[~p:~p] " ++ Msg ++ "~n", [?MODULE, ?LINE | Args])).
f() -> receive after ?TIMEOUT -> ?LOG("~p", [?SQUARE(4)]) end.18.2 Predefined macros
?MODULE, ?MODULE_STRING, ?FILE, ?LINE, ?FUNCTION_NAME, ?FUNCTION_ARITY, ?MACHINE, ?OTP_RELEASE, ?FEATURE_AVAILABLE(F), ?FEATURE_ENABLED(F).
18.3 Conditional compilation
Define from the command line: erlc -DDEBUG mod.erl or {erl_opts, [{d, 'DEBUG'}]} in rebar.config.
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.
-ifndef(DEBUG).
-define(DBG(X), ok).
-else.
-define(DBG(X), io:format("~p~n", [X])).
-endif.
-if(?OTP_RELEASE >= 27).
-define(HAS_JSON, true).
-endif.18.4 Includes
-include("records.hrl"). % relative path / include dirs
-include_lib("kernel/include/logger.hrl"). % from an application18.5 Stringify
-define(SHOW(Expr), io:format("~s = ~p~n", [??Expr, Expr])).
?SHOW(1 + 2). % prints: 1 + 2 = 318.6 Parse transforms
Compile-time AST transformations: -compile({parse_transform, my_transform}). (e.g., ms_transform for ets:fun2ms/1, lager_transform). Use sparingly.