<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On 18 jan 2013, at 16:50, Loïc Hoguin <<a href="mailto:essen@ninenines.eu">essen@ninenines.eu</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Dialyzer will complain if the function is undefined. It also breaks expectations, what's the type going in? Out?<br><br>You shouldn't use it.<br><br></blockquote>I did not see a smiley, serious man.</div><div><br></div><div>Of course you must use it, it is there!</div><div><br></div><div>For example:</div><div>- I am currently building a version system for Erlang modules and can use this feature</div><div>to implement proof of concept. The function can be used as dispatcher to different versions,</div><div>one small component in the implementation of the POC.</div><div><br></div><div>- Implement curry of functions with a little help of a simple parse_transform.</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>-module(curry).</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>-export([add/2]).</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>add(X,Y) -> X + Y.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>foo(X,Y,Z) -> X+Y-Z.</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>%% some parse_transform magic may generate this</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>'$handle_undefined_function'(add, [X]) -> fun(Y) -> add(X,Y) end;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>'$handle_undefined_function'(foo, [X]) -> fun(Y) -> fun(Z) -> foo(X,Y,Z) end end;</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>'$handle_undefined_function'(foo, [X,Y]) -> fun(Z) -> foo(X,Y,Z) end;</div><div><span class="Apple-tab-span" style="white-space: pre; ">       </span>...</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>Now we can call:</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">    </span>(currry:add(1))(2)</div><div><br></div><div><br></div><div>- implement varadic functions also with a little help of parse_transform</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">    </span>-module(m).</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre"> </span>sum(Xs) -> lists:sum(Xs).</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span> %% some parse_transform magic may generate this</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>'$handle_undefined_function'(sum, Xs) -> sum(Xs).</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>Now we can call</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>m:sum(1),</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>m:sum(1,2,3,4).</div><div><span class="Apple-tab-span" style="white-space:pre">      </span></div><div><br></div><div>- a flavour of the above is to make simple proxy modules, trace, debug...</div><div><br></div><div>And ... well the list can be extended with some creativity.</div><div><br></div><div>/Tony</div><div><br><blockquote type="cite">On 01/18/2013 04:32 PM, Tony Rogvall wrote:<br><blockquote type="cite">Wow, this must be abused without hesitation.<br><br>Really nice !<br><br>/Tony<br><br>On 18 jan 2013, at 16:25, Björn Gustavsson <<a href="mailto:bgustavsson@gmail.com">bgustavsson@gmail.com</a><br><<a href="mailto:bgustavsson@gmail.com">mailto:bgustavsson@gmail.com</a>>> wrote:<br><br><blockquote type="cite"><br><br><br>On Tue, Jan 15, 2013 at 1:33 PM, Erik Reitsma <<a href="mailto:erlang@ernovation.com">erlang@ernovation.com</a><br><<a href="mailto:erlang@ernovation.com">mailto:erlang@ernovation.com</a>>> wrote:<br><br>    On 01/15/2013 10:41 AM, Joe Armstrong wrote:<br><blockquote type="cite">    Golly - I read the code - you modified error_handler.erl !!!!<br><br>    So what happens is ...<br><br>       I call android:fooBar(Args) - fooBar is not defined in android.erl<br>       so it's caught in error_handler and then android:rpc(fooBar,<br>    [...]) is called<br>       and this ends up as a Json call to a socket -<br><br></blockquote>    Yes, that is what happens.<br><blockquote type="cite"><br></blockquote>It might interest you to know, that in R16, you can have a handler for<br>undefined functions in each module. (We needed that to implement the parse<br>transformation for parameterized modules.)<br><br>This new feature has just been merged to the master branch:<br><br><a href="https://github.com/erlang/otp/commit/209a479080214ab901116d48b90e91d6c056278d">https://github.com/erlang/otp/commit/209a479080214ab901116d48b90e91d6c056278d</a><br><br>/Bjorn<br><br>_______________________________________________<br>erlang-questions mailing list<br>erlang-questions@erlang.org <mailto:erlang-questions@erlang.org><br>http://erlang.org/mailman/listinfo/erlang-questions<br></blockquote><br>"Installing applications can lead to corruption over time. Applications<br>gradually write over each other's libraries, partial upgrades occur,<br>user and system errors happen, and minute changes may be unnoticeable<br>and difficult to fix"<br><br><br><br><br><br>_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>http://erlang.org/mailman/listinfo/erlang-questions<br><br></blockquote><br><br>-- <br>Loïc Hoguin<br>Erlang Cowboy<br>Nine Nines<br><a href="http://ninenines.eu">http://ninenines.eu</a><br></blockquote></div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px; "><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; ">"Installing applications can lead to corruption over time. </span><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; ">Applications gradually write over each other's libraries, partial upgrades occur, user and system errors happen, and minute changes may be unnoticeable and difficult to fix"</span></div><div><span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: Geneva, Arial, Helvetica, sans-serif; font-size: 12px; "><br></span></div></span><br class="Apple-interchange-newline">
</div>
<br></body></html>