사전 정의된 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
는 함수의 인자 수를 표현한다.
— END OF POST.