<br><br><div class="gmail_quote">2011/5/24 Frédéric Trottier-Hébert <span dir="ltr"><<a href="mailto:fred.hebert@erlang-solutions.com">fred.hebert@erlang-solutions.com</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
The problem of Erlang with regards to namespaces and modules goes further than just module names. In Erlang, the following units can be sharing/clashing namespaces: the process registry, ETS tables, module names, application names, shared records, etc. They're currently entirely disjoint and only held together by convention.<br>
</blockquote><div><br>Absolutely - and inconsistently<br><br>We can say   <br><br>     Pid = spawn(fun() -> ... end)<br>     Pid ! M<br>     register(name, Pid),<br>     name ! Pid<br><br>But not<br><br>     Mod = load([ .... lists of funs ...])<br>
     Mod:reverse(...)<br>     register(lists, Mod)<br>     lists:reverse(..)<br><br>same comment for ets tables etc.<br>     <br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

However, any change to one of the solutions needs to somehow be reflected into the others, even if it's still by convention.<br>
<br>
IMO the basic hierarchy of Erlang seems to begin with the OTP release. The name of an OTP application will decide the prefixes used in module names, process names, table names, shared record names, etc. There is nothing to check that application names are unique except the programmer looking out for that, while xref and the compiler can help a bit with the rest.<br>

<br>
I think we can generalise OTP to have this given kind of organisation:<br>
     release -> OTP applications -> [Modules, Tables, Shared Records, Processes]<br>
<br>
An application itself wouldn't have to worry about namespaces (if we forget included applications). The namespace problem comes at the release stage or if we're developing entirely outside of OTP, still using applications or their equivalent.<br>

<br>
To me, this makes it feel like namespace management/giving aliases and replacement of values should be managed from the release point of view, but I can't offer any suggestions as to how this could take place without relying on file renaming and strict use of ?NAMESPACE-like macros throughout the code. Nothing easily backwards compatible, and nothing to help people who are not using releases though.<br>

<br>
This in no way would solve Joe's problem with being undecided as to where functions should go, but I think getting rid of modules altogether in Erlang wouldn't be doable because of the other dependencies. In places like Javascript (client-side) or schemes without good module functionality, you pretty much just include the files and people then tend to wrap everything in functions or objects to provide an ad-hoc equivalent to namespaces or modules. I can see this behaviour emerging if Erlang were to go that way.<br>

<font color="#888888"><br></font></blockquote><div><br>I agree - it's not just "getting rid of modules" there's a whole load of other stuff.<br> </div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<font color="#888888">
--<br>
Fred Hébert<br>
<a href="http://www.erlang-solutions.com" target="_blank">http://www.erlang-solutions.com</a><br>
<br>
<br>
</font></blockquote></div><br>