- PVSM.RU - https://www.pvsm.ru -
Иногда не хватает в Erlang этой интересной особенности, вот и захотелось мне в заиметь эту фичу.
Поискав по просторам интернета наткнулся на статью [1].
Автор практически полностью реализовал весь функционал кроме передачи аргументов декоратору.
Сразу дам ссылку [2] на Github.
Итак, отличие моего проекта — декоратору можно прередать праметры и опцию verbose, благодаря которой 3-м аргументом в декоратор будет передан кортеж с именем функции и строкой в файле.
Пример использования, который использует обе эти особенности (конечно не production, но суть должна быть ясна).
-module(memoize).
% This row is required for decorators
-compile([{parse_transform,decorators}]).
% exporting decorator function
-export([memoize/4]).
% api exports
-export([fact/1]).
% pretty decorator usage
-define(MEMOIZE, -decorate({?MODULE,memoize,[?MODULE],verbose})).
memoize(F,Args,{FunName,_Line},Module)->
case ets:info(memoize) of
undefined ->
ets:new(memoize,[public,named_table]);
_->
ok
end,
case ets:lookup(memoize,{Module,FunName,Args}) of
[] ->
R = apply(F,[Args]),
ets:insert(memoize,{{Module,FunName,Args},R}),
R;
[{_,Value}] ->
Value
end.
?MEMOIZE. % декоратор
fact(N) when is_integer(N) andalso N>=1 ->
fact(N,1).
fact(1,Acc) -> Acc;
fact(N,Acc) -> fact(N-1,Acc*N).
Ну и тест 2-х вызовов:
>> timer:tc(memoize,fact,[1000]).
{1282,
... }.
>> timer:tc(memoize,fact,[1000]).
{9,
... }.
Т.е. прирост заметен :)
Не хочу разводить холивар на тему нужно это или нет, просто буду рад, если кому пригодится…
P.S.
Если кому будет интересно — могу в дальнейшем полностью описать весь процесс кодогенерации через parse_transform…
Автор: egobrain
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/erlang/10182
Ссылки в тексте:
[1] статью: http://niki.code-karma.com/2011/06/python-style-decorators-in-erlang/
[2] ссылку: https://github.com/Egobrain/erlang_decorators
Нажмите здесь для печати.