[erlang-questions] Instrumentation
Michał Ptaszek
michal.ptaszek@REDACTED
Mon Dec 5 12:08:16 CET 2011
Hi Tim,
you might want to take a look at ennotation: it's
something I've derived from erlang-web, but which has
been reimplemented from scratch.
https://github.com/paulgray/ennotation
Best regards,
Michal Ptaszek
----- Original Message -----
> There have been a few conversations about instrumentation libraries
> on the
> list, and I've been experimenting with the features Ulf recently
> added to
> parse_trans. I've worked up a simple annotations library, that let's
> you
> put attributes/annotations on specific functions and attach behaviour
> to
> them in the form of an implementation module. The current framework
> is very
> crude and relies on a compile time parse transform, though obviously
> it'll
> be relatively trivial to implement runtime code changes as well.
>
> The purpose of this prototyping was to play around with some of the
> ideas
> in Aspect Oriented Programming, and the library allows you to write
> code
> that executes before, after or around an annotated function. This is
> done
> without macros, which feels a bit neater to me than the approach used
> in
> erlang-web. In addition to the library, I've made a small reference
> project
> which implements a simple function memoization annotation using ets
> as a
> cache. The implementation of the annotation itself is very simple:
>
> -module(memoize).
> -annotation('function'). %% scoped to functions
> -export([init/1]).
> -export([around_advice/4]).
>
> init(Module) ->
> ets:new(Module, [ordered_set, public, named_table,
> {write_concurrency,true},
> {read_concurrency,true}, compressed]),
> ok.
>
> around_advice(_A, M, F, Inputs) ->
> case ets:lookup(M, {F, Inputs}) of
> [] ->
> Result = annotation:call_advised(M, F, Inputs),
> true = ets:insert_new(M, {{F, Inputs}, Result}),
> Result;
> [{_, Memoized}] ->
> Memoized
> end.
>
> And the usage of the annotation is very simple too:
>
> -module(fib_mem).
> -export([start_memoize/0, fib/1]).
> -include_lib("annotations/include/annotations.hrl").
>
> start_memoize() ->
> memoize:init(?MODULE).
>
> -memoize(ets).
> fib(0) -> 0;
> fib(1) -> 1;
> fib(N) -> fib(N - 1) + fib(N - 2).
>
> --------------------
>
> As I said, the implementation is very crude but I hope that the
> concepts
> will trigger some discussion about whether this is a useful
> contribution
> and in what directions it ought to go.
>
> Code is here: https://github.com/hyperthunk/annotations
> Memoize is here: https://github.com/nebularis/memoize
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
More information about the erlang-questions
mailing list