Annotations 0.0.2
05/02/2012 12:52
Annotations позволяют генерировать новые функции или расширять функциональность существующих функций при помощи аннотаций кода.
Пример:
Создаем аннотацию:
-module(logging).
-annotation('function'). %% the scope of this annotation
-compile(export_all).
before_advice(#annotation{data=Lvl}, M, F, Inputs) ->
log(Lvl, "before_advice - M: ~p, F: ~p, Inputs: ~p~n", [M, F, Inputs]),
Inputs.
after_advice(#annotation{data=Lvl}, M, F, _Inputs, Result) ->
log(Lvl, "after_advice - M: ~p, F: ~p, Result: ~p~n", [M, F, Result]),
Result.
log(Lvl, Message, Args) ->
case get(loglevel) of
Lvl ->
io:format(Message, Args);
_ ->
ok
end.Используем аннотацию (обратите внимание на -loggng(info)):
-module(annotated).
-export([foo/1]).
-include_lib("annotations/include/annotations.hrl").
-logging(info).
-spec(foo/1 :: (term()) -> {foo, string(), term()}).
foo(T) ->
{foo, T}.А теперь со всем этим взлетаем:
t4@malachi:simple $ rebar clean compile
# output snipped...
t4@malachi:simple $ erl -pa ebin/
Erlang R14B01 (erts-5.8.2) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.2 (abort with ^G)
1> annotated:foo("Hello world").
{foo,"Hello world"}
2> put(loglevel, info).
undefined
3> annotated:foo("Hello world").
before_advice - M: logging, F: foo, Inputs: ["Hello world"]
after_advice - M: logging, F: foo, Result: {foo,"Hello world"}
{foo,"Hello world"}
4>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution
a
t4@malachi:simple $ Библиотека и документация по ней доступны на GitHub'е: https://github.com/hyperthunk/annotations
