Эрланговые Декораторы

Иногда в Эрланге не хватает этой интересной возможности, поэтому мне захотелось ее получить.

Поискав в Интернете, я наткнулся статья .

Автор практически полностью реализовал весь функционал, кроме передачи аргументов декоратору.

я дам это сразу связь на Гитхабе.

Итак, отличие моего проекта в том, что декоратор может настроить параметры и опции.

подробный , благодаря чему декоратору в качестве 3-го аргумента будет передан кортеж с именем функции и строкой в файле.

Пример варианта использования, в котором используются обе эти функции (конечно, не производственный, но суть должна быть ясна).

  
   

-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. % decorator 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. Теги: #erlang #Erlang/OTP

Вместе с данным постом часто просматривают: