アーランデコレーター

Erlangにはこの興味深い機能が欠けている場合があるため、この機能を手に入れたかったのです。

インターネットを検索した後、私は記事に出会いました。

著者は、引数をデコレータに渡すことを除いて、ほぼすべての機能を実装しました。

すぐにGithubへのリンクを提供してください

だから、私のプロジェクトの違い-デコレータはパラメータ詳細オプションのプレフィックスを付けることができます。これにより、関数名とファイル内の行を持つタプルが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, ... }. 


つまり 成長が顕著です:)

これが必要であるかどうかに関係なく、トピックでホリバーを繁殖させたくありません。それが便利になれば嬉しいです...

PS
誰かが興味を持っている場合-parse_transformを使用してコード生成のプロセス全体をさらに詳しく説明できます...

Source: https://habr.com/ru/post/J146495/


All Articles