<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">For the sake of trying out some ideas, I experimented with doing this:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:monospace;color:rgb(24,178,24);background-color:rgb(255,255,255)">$</span><span style="font-family:monospace;color:rgb(0,0,0);background-color:rgb(255,255,255)"> cat > t.erl</span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:monospace"><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-module</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">t</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">).
</span><br>
<br><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-export</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(255,215,215);background-color:rgb(255,255,255)">[</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">t</span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">/</span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">1</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'__info__'</span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">/</span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">1</span><span style="color:rgb(255,215,215);background-color:rgb(255,255,255)">]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">).
</span><br>
<br><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'__info__'</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">module</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">)           </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'Elixir.Temp'</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">;
</span><br><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'__info__'</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">functions</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">)        </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,215,215);background-color:rgb(255,255,255)">[]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">;
</span><br><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'__info__'</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">macros</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">)           </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,215,215);background-color:rgb(255,255,255)">[]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">;
</span><br><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'__info__'</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="font-weight:bold;color:rgb(84,255,255);background-color:rgb(255,255,255)">Key</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">=</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">attributes</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">) </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-></span> get_module_info(<font color="#f769ea" style="--darkreader-inline-color:#f279da;">?MODULE</font><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="font-weight:bold;color:rgb(84,255,255);background-color:rgb(255,255,255)">Key</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">);
</span><br><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'__info__'</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="font-weight:bold;color:rgb(84,255,255);background-color:rgb(255,255,255)">Key</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">=</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">compile</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">)    </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-></span> get_module_info(<font color="#f769ea" style="--darkreader-inline-color:#f279da;">?MODULE</font><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="font-weight:bold;color:rgb(84,255,255);background-color:rgb(255,255,255)">Key</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">);
</span><br><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'__info__'</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="font-weight:bold;color:rgb(84,255,255);background-color:rgb(255,255,255)">Key</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">=</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">md5</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">)        </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-></span> get_module_info(</span><span style="color:rgb(242,121,218);font-family:monospace">?MODULE</span><span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">, </span><span style="font-weight:bold;color:rgb(84,255,255);background-color:rgb(255,255,255)">Key</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">);
</span><br><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">'__info__'</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">(</span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">deprecated</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">)       </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,215,215);background-color:rgb(255,255,255)">[]</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">.
</span><br>
<br>t(<span style="font-weight:bold;color:rgb(84,255,255);background-color:rgb(255,255,255)">A</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">) </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">-></span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="font-weight:bold;color:rgb(84,255,255);background-color:rgb(255,255,255)">A</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,255,84);background-color:rgb(255,255,255)">+</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> </span><span style="color:rgb(255,84,255);background-color:rgb(255,255,255)">1</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">.</span><br>
<br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:monospace;color:rgb(24,178,24);background-color:rgb(255,255,255)">$</span><span style="font-family:monospace;color:rgb(0,0,0);background-color:rgb(255,255,255)"> erlc +debug_info t.erl</span><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:monospace"><span style="color:rgb(24,178,24);background-color:rgb(255,255,255)">$</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)"> iex</span><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:monospace"><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">iex(1)> Temp.t(1)
</span><br>
<br></span><span style="font-family:monospace"><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">** (UndefinedFunctionError) function Temp.t/1 is undefined (module Temp is not available)</span><span style="color:rgb(0,0,0);background-color:rgb(255,255,255)">
</span><br><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)">    Temp.t(1)</span><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:monospace"><span style="color:rgb(178,24,24);background-color:rgb(255,255,255)"><br></span></span></div><div class="gmail_default" style=""><font face="arial, sans-serif">This error makes sense - Erlang expects the module name to be 't', and Elixir expects it</font></div><div class="gmail_default" style=""><font face="arial, sans-serif">to be 'Elixir.Temp', and the meta information doesn't help much.</font></div><div class="gmail_default" style=""><font face="arial, sans-serif">If we rename the file to Elixir.Temp.erl and the module name to 'Elixir.Temp',</font></div><div class="gmail_default" style=""><font face="arial, sans-serif">then all works well.</font></div><div class="gmail_default" style=""><font face="arial, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, sans-serif">Wouldn't it be nice if the Erlang modules allowed aliases so that we could have a single</font></div><div class="gmail_default" style=""><font face="arial, sans-serif">module compiled by Erlang to be used in both languages using their native naming convention?</font></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Sep 1, 2021 at 11:19 PM Dominic Morneau <<a href="mailto:dmorneau@gmail.com" target="_blank">dmorneau@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Telemetry is a good example of an Elixir-friendly Erlang lib, especially the docs: <a href="https://github.com/beam-telemetry/telemetry/" target="_blank">https://github.com/beam-telemetry/telemetry/</a><div><br></div><div>Some of the general Elixir library guidelines here also apply in Erlang: <a href="https://hexdocs.pm/elixir/library-guidelines.html#content" target="_blank">https://hexdocs.pm/elixir/library-guidelines.html#content</a></div><div><div><br></div><div>The module name isn't a big deal IMHO, users can just do "alias :erl_lib, as: ErlLib" if it bothers them.</div></div><div><br></div><div>Dominic</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">2021年9月2日(木) 8:04 Serge Aleynikov <<a href="mailto:serge@aleynikov.org" target="_blank">serge@aleynikov.org</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div style="font-family:arial,helvetica,sans-serif">Is there any guideline for making Erlang projects be more Elixir friendly?</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">When developing an Erlang library, it would be nice to have its functions callable from Elixir not like:</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">:erl_lib.some_fun()</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">but rather</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">ErlLib.some_fun()</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">without needing to write a "glue" module compiled into 'Elixir.ErlLib.beam'  that would import all functions from erl_lib and export them locally?</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">Are there more requirements of some metadata (e.g. '__info__'/1) to be included in the Erlang modules?</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">Regards,</div><div style="font-family:arial,helvetica,sans-serif"><br></div><div style="font-family:arial,helvetica,sans-serif">Serge</div></div>
</blockquote></div></div>
</blockquote></div>