[erlang-questions] one-time evaluated functions

Pierre Fenoll pierrefenoll@REDACTED
Mon Oct 30 19:05:18 CET 2017


When I don’t really know the best way to store such a value and it doesn’t
change I just create a dedicated and locally named gen_server.
If the state I want to store is “large” I put it in the gen_server’s pdict
which may or may not be a good idea. The process dictionary gets dumped
when the server crashes.

Fred Herbert has an interesting article about the pdict:
https://ferd.ca/on-the-use-of-the-process-dictionary-in-erlang.html

On Mon 30 Oct 2017 at 18:29, Chandrashekhar Mullaparthi <
chandrashekhar.mullaparthi@REDACTED> wrote:

> Actually this won’t work properly if you have a bunch of requests come in
> concurrently the first time around. Some of them will see undefined as the
> result. So you’ll need extra code to sleep and retry if the ets lookup
> returns undefined (unless undefined is a valid value!)
>
>
> On 30 Oct 2017, at 17:20, Chandrashekhar Mullaparthi <
> chandrashekhar.mullaparthi@REDACTED> wrote:
>
> Here is the code for the boring solution.
>
> case ets:insert_new(EtsTab, {singleton, undefined}) of
>     false ->
>         ets:lookup_element(EtsTab, singleton, 2);
>     true ->
>         Val = evaluate_one_time_function(),
>          ets:insert(EtsTab, {singleton, Val}),
>         Val
>     end.
>
> You have to make sure that the ETS table is owned by some long lived
> process and is of type public if you are going to invoke this function from
> multiple processes.
>
> Cheers
> Chandru
>
>
> On 30 Oct 2017, at 17:05, Mikael Pettersson <mikpelinux@REDACTED> wrote:
>
> Yes.
>
> 1. (Boring) Have a persistent store somewhere, and have the function check
> if the value is stored there or not.  If not, compute it and store.  An ETS
> table would work fine, but you need to ensure it's lifetime matches your
> requirements.  A plain file containing term_to_binary/1 of the value should
> also work.  Or use a DB.
>
> 2. (More fun) Place the function in a module M.  Initial version computes
> the value and generates a new version of the module where the function now
> just returns that constant value.  There will probably be some restrictions
> on what kinds of values you can return this way, i.e. I wouldn't expect a
> function value with closed over free variables to work, but anything you
> could include in a pattern match should work.
>
> On Mon, Oct 30, 2017 at 4:41 PM, Jarosław Preś <jaroslaw.p.75@REDACTED>
> wrote:
>
>> Hi,
>>
>> Is it possible to make an erlang function be evaluated only once at first
>> call and then return this value each time?
>>
>> BR/Jarek
>>
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-- 

Cheers,
-- 
Pierre Fenoll
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20171030/87000b48/attachment.htm>


More information about the erlang-questions mailing list