<div><div dir="auto">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. </div><div dir="auto">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. </div></div><div dir="auto"><br></div><div dir="auto">Fred Herbert has an interesting article about the pdict: </div><div><div dir="auto"><a href="https://ferd.ca/on-the-use-of-the-process-dictionary-in-erlang.html">https://ferd.ca/on-the-use-of-the-process-dictionary-in-erlang.html</a><br></div><div><br><div class="gmail_quote"><div>On Mon 30 Oct 2017 at 18:29, Chandrashekhar Mullaparthi <<a href="mailto:chandrashekhar.mullaparthi@gmail.com" target="_blank">chandrashekhar.mullaparthi@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">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!)</div><div dir="auto"><br><div><div><span style="background-color:rgba(255,255,255,0)"></span></div></div><div><br><div></div>On 30 Oct 2017, at 17:20, Chandrashekhar Mullaparthi <<a href="mailto:chandrashekhar.mullaparthi@gmail.com" target="_blank">chandrashekhar.mullaparthi@gmail.com</a>> wrote:<br><br></div><blockquote type="cite"><div><div>Here is the code for the boring solution. </div><div><br></div>case ets:insert_new(EtsTab, {singleton, undefined}) of<div>    false -></div><div>        ets:lookup_element(<span style="background-color:rgba(255,255,255,0)">EtsTab, singleton, 2);</span></div><div>    true -></div><div>        Val = evaluate_one_time_function(),</div><div>         ets:insert(<span style="background-color:rgba(255,255,255,0)">EtsTab, {singleton, Val}),</span></div><div>        Val</div><div>    end.</div><div><br></div><div>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. </div><div><br></div><div>Cheers</div><div>Chandru<br><div><div><br></div><div><span style="background-color:rgba(255,255,255,0)"></span></div></div><div><br><div></div>On 30 Oct 2017, at 17:05, Mikael Pettersson <<a href="mailto:mikpelinux@gmail.com" target="_blank">mikpelinux@gmail.com</a>> wrote:<br><br></div><blockquote type="cite"><div><div><div><div>Yes.</div><div><br></div>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.<br><br></div>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.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 30, 2017 at 4:41 PM, Jarosław Preś <span><<a href="mailto:jaroslaw.p.75@gmail.com" target="_blank">jaroslaw.p.75@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>Hi,</div><div><br></div><div>Is it possible to make an erlang function be evaluated only once at first call and then return this value each time?</div><div><br></div><div>BR/Jarek</div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>erlang-questions mailing list</span><br><span><a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a></span><br><span><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a></span><br></div></blockquote></div></div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>erlang-questions mailing list</span><br><span><a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a></span><br><span><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a></span><br></div></blockquote></div>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div></div></div><div dir="ltr">-- <br></div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div><br></div><div>Cheers,</div><div>-- </div><div>Pierre Fenoll</div></div><div><br></div></div></div>