Hi,<br><br><div class="gmail_quote">On Tue, May 24, 2011 at 10:06, Joe Armstrong <span dir="ltr"><<a href="mailto:erlang@gmail.com">erlang@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Do we need module's at all? Erlang programs are composed of lots of small<br>functions, the only place where modules seem useful is to hide a letrec.<br>
<br>The classic example is fibonacci. We want to expose fib/1 but hide the<br>helper function fib/3. Using modules we say<br><br>-module(math).<br>-export([fib/1]).<br><br>fib(N) -><br>    fib(N, 1, 0).<br><br>fib(N, A, B) when N < 2 -> A;<br>


fib(N, A, B) -> fib(N-1, A+B, A).<br><br>The downside is we have had to *invent* one module name math - whose *only*<br>purpose is to hide the definition of fib/3 which we don't want to be made <br>callable.<br><br>


If we put a second function into the module math, then this second function<br>could call fib/3 which breaks the encapsulation of fib/3.<br><br>We could say:<br><br>let fib = fun(N) -> fib(N, 1, 0) end<br>in<br>   fib(N, A, B) when N < 2 -> A;<br>


   fib(N, A, B) -> fib(N-1, A+B, A).<br>end.</blockquote><div><br></div><div>One reason where letrec might not be a good enough replacement for a helper function that is private to a module, is if this helper function is called from many places. I wouldn't want to have to repeat its definition every time I need it...</div>

<div><br></div><div>I also feel like Mazen that unless there is a big shift in the way we think about the programs, the problem will still be present at the prefix level.</div><div><br></div><div>If there is to be a big shift in the paradigms, then the question is whether the result will still be Erlang... </div>

<div><br></div><div>regards,</div><div>Vlad</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"> </blockquote></div>