사전 정의된 erlang 매크로들

erlang에서는 C 언어의 #define 처럼 매크로를 정의해서 사용할 수 있다. 다음과 같이 정의한다.

-define(VAR, 10).
-define(Function(Arg1, Arg2), YourCodes).

그 후 원하는 곳에 ?VAR 처럼 앞에 ?를 붙여 사용한다. 두 번째 함수 매크로의 경우 정의한 arg의 수를 맞춰서 사용해야 한다.

위와 같이 -define으로 따로 정의하지 않아도 erlang 내부적으로 정의되어 있는 매크로들이 있다. 다음은 사전 정의된 매크로들을 확인할 수 있는 예제 코드이다.

% macros.erl
-module(macros).
-export([print/0]).

print() ->
  io:format("?MODULE = ~p~n", [?MODULE]),
  io:format("?MODULE_STRING = ~p~n", [?MODULE_STRING]),
  io:format("?FILE = ~p~n", [?FILE]),
  io:format("?LINE = ~p~n", [?LINE]),
  io:format("?MACHINE = ~p~n", [?MACHINE]),
  io:format("?FUNCTION_NAME = ~p~n", [?FUNCTION_NAME]),
  io:format("?FUNCTION_ARITY = ~p~n", [?FUNCTION_ARITY]),
  ok.

실행 결과는 다음과 같다.

Eshell V8.3  (abort with ^G)
1> macros:print().
?MODULE = macros
?MODULE_STRING = "macros"
?FILE = "macros.erl"
?LINE = 9
?MACHINE = 'BEAM'
?FUNCTION_NAME = print
?FUNCTION_ARITY = 0
ok

?MODULE, ?MACHINE, ?FUNCTION_NAME은 각각 모듈명, 머신 종류, 함수명을 atom 형식으로 치환한다. 오히려 문자열로 치환되는 ?FILE이 특이한 케이스이다. 모듈명의 경우 문자열로 치환해달라는 요구사항이 많았는지 ?MODULE_STRING이 따로 정의돼 있다. 마지막 ?FUNCTION_ARITY는 함수의 인자 수를 표현한다.