<div dir="ltr">Other possibilities for handling global variables:<div><br></div><div style>Using app configs (either with the config file or application:set_env/2 application:get_env/3)</div><div style>Defining a macro in a header file that you include in every module that needs to access the constant</div>
<div style>Returning the value in a function exported by some module (this seems strange to me).</div><div style><br></div><div style>If the value is truly constant and is meaningful to a specific application, I would strongly recommend the first approach. The second approach is a bit harder to reason about and requires more resource juggling for the developer.</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Dec 30, 2012 at 12:56 PM, Tyron Zerafa <span dir="ltr"><<a href="mailto:tyron.zerafa@gmail.com" target="_blank">tyron.zerafa@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 dir="ltr"><div>My idea is to serialize a function, send it over to a remote node, decode it there and execute it. I am trying to find the possible things that may go wrong in this approach.</div>
<div><br></div><div>Since there is no global variables, then I only need to care for the process dictionary and ets tables. </div>
<div>However, I am finding a LOT of operations with side effects such as mnesia, messages and dets which somehow need to be reflected on the original node.</div><div><br></div><div>Any idea how I can go about this differently or whether I am missing anything?</div>

<div class="gmail_extra"><div><div class="h5"><br><br><div class="gmail_quote">On Sun, Dec 30, 2012 at 4:49 PM, Ulf Wiger <span dir="ltr"><<a href="mailto:ulf@feuerlabs.com" target="_blank">ulf@feuerlabs.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><br><div><div><div>On 30 Dec 2012, at 12:16, Tyron Zerafa wrote:</div><br><blockquote type="cite"><div dir="ltr"><div>I have been reading about Erlang and I am finding a problem grasping the meaning of some terms related to variables.</div>

<div><br></div><div>What do global, free and unbound variables stand for in Erlang? Do they mean the same thing?</div></div></blockquote><div><br></div></div><div>Global variables is what Erlang doesn't have. ;-)</div>

<div><br></div><div>You can simulate global variables using processes or (within the scope of a process) using the process dictionary, as Michael Turner pointed out.</div><div><div><br></div><br><blockquote type="cite">
<div dir="ltr"><div>Is there a notion of global/free/unbound variables in Erlang? For instance, can I somehow implement this lambda:  <span style="line-height:19.200000762939453px;font-size:13px;font-family:sans-serif">λy -></span><b style="line-height:19.200000762939453px;font-size:13px;font-family:sans-serif"> </b>x+y+1 ?</div>

</div></blockquote><div><br></div><div><br></div></div><div>You can do that, by passing X to the function that creates the lambda:</div><div><br></div><div>lambda(X) -></div><div>   fun(Y) -></div><div>         X + Y + 1</div>

<div>   end.</div><div><br></div><div>The closure will include X in its environment. Of course X will be immutable.</div><div><div><br></div><blockquote type="cite"><div dir="ltr">
<div>If Erlang does not support global/ free/unbound variables, can we say that a function does not have side-effects?</div></div></blockquote><div><br></div></div><div>You can't say that generally, since you can call side-effecting functions from any function. There is currently no way to guarantee that a function is pure, either through static or dynamic analysis.</div>

<div><br></div><div>OTOH, the number of side-effecting operations in Erlang are relatively few, so it's not too hard to determine that a function is pure in most cases. Note that any function that calls other modules will have to be treated as potentially side-effecting, since the semantics of the remote call is determined at the time of the call, and dynamic code loading can completely alter the type signature and semantics of an exported function.</div>

<div><br></div><div>BTW, variables are free until bound, but you cannot reference an unbound variable unless that expression also binds a value to it. In other words, an unbound variable cannot appear in the RHS of an expression. Thus, you cannot get a null reference exception in Erlang, which even Sir Anthony Hoare will agree is a Very Good Thing. [1]</div>

<div><br></div><div>BR,</div><div>Ulf W</div><div><br></div><div>[1] <a href="http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare" target="_blank">http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare</a></div>

<div><br></div><div><br></div></div><br><div>
<span style="text-indent:0px;letter-spacing:normal;font-variant:normal;text-align:-webkit-auto;font-style:normal;font-weight:normal;line-height:normal;border-collapse:separate;text-transform:none;font-size:medium;white-space:normal;font-family:Helvetica;word-spacing:0px"><div>

<div>Ulf Wiger, Co-founder & Developer Advocate, Feuerlabs Inc.</div><div><a href="http://feuerlabs.com" target="_blank">http://feuerlabs.com</a></div></div><div><br></div></span><br>
</div>
<br></div></blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br>Best Regards,<div>Tyron Zerafa</div>
</font></span></div></div>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>