<html><head></head><body><div style="font-family:Helvetica Neue, Helvetica, Arial, sans-serif;font-size:13px;"><div></div>
<div>While I agree guards are often ignored, they're often ignored because they're limited. I'd rather be able to write my own guard functions, with the warning that they need to be side effect free and performant, than be able to use them only 10% of the time.<br><br>However that doesn't excuse the multiple cases here. I do often use cases to validate input, because guards often won't do, however you only need one!<br><br>muldiv(First, Second) -></div><div> case {is_integer(First), is_integer(Second)} of<br> {true, true} -> </div><div><div style="font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;"> Quotient = First div Second,</div><div style="font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;"> Product = First * Second,</div><div style="font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;"> {ok, {Product, Quotient}}<br> end.<br><br>But in an ideal world, I could write my own guard functions so that, when its not a trivial is_integer/1, I can still use guards.</div><br></div>
<div id="yahoo_quoted_6683552356" class="yahoo_quoted">
<div style="font-family:'Helvetica Neue', Helvetica, Arial, sans-serif;font-size:13px;color:#26282a;">
<div>
On Tuesday, September 26, 2017, 1:23:28 AM EDT, dploop <dploop@163.com> wrote:
</div>
<div><br></div>
<div><br></div>
<div><div id="yiv5021183183"><html><head><style>#yiv5021183183 body {line-height:1.5;}#yiv5021183183 blockquote {margin-top:0px;margin-bottom:0px;margin-left:0.5em;}#yiv5021183183 div.yiv5021183183foxdiv20170926130500390717 {}#yiv5021183183 body {font-size:10.5pt;color:rgb(0, 0, 0);line-height:1.5;}</style></head><div>
<div><span style="font-size:10.5pt;line-height:1.5;background-color:window;">> "</span><span style="font-size:10.5pt;line-height:1.5;background-color:window;">Obsessing over a rocket shape doesn't seem as important as the absence of any guard expression usage here. Guards are unfortunately often ignored by Erlang programmers, though they are the one thing in Erlang without side-effects."</span></div><div><span style="font-size:10.5pt;line-height:1.5;background-color:window;"><br clear="none"></span></div><div><span style="font-size:10.5pt;line-height:1.5;background-color:window;">is_integer, is_zero is just a simplified example, and by coincidence, they can use in the guard. But in most situations you can't use guard, for example in game industry when player want to buy equipment, you should check if his coin is sufficient, and then you should check the number of equipment is right and then you should check if the equipment is valid to exchange and so on. The complex business logic can't be easily solved by guard, and Nested Cases is inevitable.</span></div><div><span style="font-size:10.5pt;line-height:1.5;background-color:window;"><br clear="none"></span></div>
<div><br clear="none"></div><hr align="left" style="width:210px;min-height:1px;" color="#b5c4df" size="1">
<div><span></span><div style="MARGIN:10px;FONT-FAMILY:verdana;FONT-SIZE:10pt;"><div>dploop@163.com</div></div></div>
<blockquote style="margin-top:0px;margin-bottom:0px;margin-left:0.5em;"><div> </div><div class="yiv5021183183yqt4618319662" id="yiv5021183183yqt09725"><div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm;"><div style="PADDING-RIGHT:8px;PADDING-LEFT:8px;FONT-SIZE:12px;FONT-FAMILY:tahoma;COLOR:#000000;BACKGROUND:#efefef;PADDING-BOTTOM:8px;PADDING-TOP:8px;"><div><b>From:</b> <a rel="nofollow" shape="rect" ymailto="mailto:mjtruog@gmail.com" target="_blank" href="mailto:mjtruog@gmail.com">Michael Truog</a></div><div><b>Date:</b> 2017-09-26 12:48</div><div><b>To:</b> <a rel="nofollow" shape="rect" ymailto="mailto:dploop@163.com" target="_blank" href="mailto:dploop@163.com">dploop@163.com</a>; <a rel="nofollow" shape="rect" ymailto="mailto:erlang-questions@erlang.org" target="_blank" href="mailto:erlang-questions@erlang.org">Erlang-Questions Questions</a></div><div><b>Subject:</b> Re: [erlang-questions] Nested Case Statements v.s. multiple functions</div></div></div><div><div class="yiv5021183183FoxDiv20170926130500390717">
<div class="yiv5021183183moz-cite-prefix">On 09/25/2017 07:40 PM, <a rel="nofollow" shape="rect" class="yiv5021183183moz-txt-link-abbreviated" ymailto="mailto:dploop@163.com" target="_blank" href="mailto:dploop@163.com">dploop@163.com</a>
wrote:<br clear="none">
</div>
<blockquote type="cite" style="margin-top:0px;margin-bottom:0px;margin-left:0.5em;">
<div style="orphans:2;widows:2;">This problem also <span style="font-size:10.5pt;line-height:1.5;">bothered me for a long time, so I write a
parse transform to deal with it. To be </span><span style="font-size:10.5pt;line-height:1.5;">specific, say we want to write a function
which takes two integers and returns the product and </span><span style="font-size:10.5pt;line-height:19px;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e">quotient
of them.</font></span></div>
<div style="orphans:2;widows:2;"><span style="font-size:10.5pt;line-height:19px;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e"><br clear="none">
</font></span></div>
<div style="orphans:2;widows:2;">
<pre style="font-family:SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:13.6px;margin-top:0px;margin-bottom:0px;word-wrap:normal;padding:16px;overflow:auto;line-height:1.45;background-color:rgb(246, 248, 250);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(36, 41, 46);"><span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">muldiv</span>(<span class="yiv5021183183pl-smi" style="">First</span>, <span class="yiv5021183183pl-smi" style="">Second</span>) <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">-></span>
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">case</span> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">is_integer</span>(<span class="yiv5021183183pl-smi" style="">First</span>) <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">of</span>
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">true</span> ->
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">case</span> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">is_integer</span>(<span class="yiv5021183183pl-smi" style="">Second</span>) <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">of</span>
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">true</span> ->
<span class="yiv5021183183pl-smi" style="">Product</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">=</span> <span class="yiv5021183183pl-smi" style="">First</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">*</span> <span class="yiv5021183183pl-smi" style="">Second</span>,
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">case</span> <span class="yiv5021183183pl-smi" style="">Second</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">=/=</span> <span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">0</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">of</span>
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">true</span> ->
<span class="yiv5021183183pl-smi" style="">Quotient</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">=</span> <span class="yiv5021183183pl-smi" style="">First</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">div</span> <span class="yiv5021183183pl-smi" style="">Second</span>,
{<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">ok</span>, {<span class="yiv5021183183pl-smi" style="">Product</span>, <span class="yiv5021183183pl-smi" style="">Quotient</span>}};
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">false</span> ->
{<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">error</span>, <span class="yiv5021183183pl-s" style="color:rgb(3, 47, 98);"><span class="yiv5021183183pl-pds" style="">"</span>Second must not be zero!<span class="yiv5021183183pl-pds" style="">"</span></span>}
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">end</span>;
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">false</span> ->
{<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">error</span>, <span class="yiv5021183183pl-s" style="color:rgb(3, 47, 98);"><span class="yiv5021183183pl-pds" style="">"</span>Second must be an integer!<span class="yiv5021183183pl-pds" style="">"</span></span>}
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">end</span>;
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">false</span> ->
{<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">error</span>, <span class="yiv5021183183pl-s" style="color:rgb(3, 47, 98);"><span class="yiv5021183183pl-pds" style="">"</span>First must be an integer!<span class="yiv5021183183pl-pds" style="">"</span></span>}
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">end</span>.</pre>
</div>
<div style="orphans:2;widows:2;"><br clear="none">
</div>
</blockquote>
Obsessing over a rocket shape doesn't seem as important as the
absence of any guard expression usage here. Guards are
unfortunately often ignored by Erlang programmers, though they are
the one thing in Erlang without side-effects. Ideally, the source
code is written to break when bad input is provided, and that
doesn't require that you define the exception thrown for bad input.
A more minimal example without the added complexity here is below:<br clear="none">
<br clear="none">
muldiv(First, 0)<br clear="none">
when is_integer(First) -><br clear="none">
0;<br clear="none">
muldiv(First, Second)<br clear="none">
when is_integer(First), is_integer(Second) -><br clear="none">
{ok, {First * Second, First div Second}}.<br clear="none">
<br clear="none">
That gets rid of all the noise and useless error returns, and
instead lets the process die when there is a problem, unless the
exception is caught and handled. You could add another function
clause to do an error/exit/throw on bad input, so it is a clear
misuse of a function which would be checked with dialyzer, and
dialyzer should be capable of inferring the types from the guards
(the current code above should be known to only accept integers, and
other usage would cause a dialyzer error... adding a bad input
function clause would break that, but then that could be fixed by
the Erlang type specification), even if the Erlang type
specification isn't added.<br clear="none">
<br clear="none">
Best Regards,<br clear="none">
Michael<br clear="none">
<br clear="none">
<blockquote type="cite" style="margin-top:0px;margin-bottom:0px;margin-left:0.5em;">
<div style="orphans:2;widows:2;">Ugly, at least I think this
"rocket" is not beautiful. Even worse, if requirement changed,
you should modify this code on a large scale. To avoid this
problem, you can just rewrite your code like this</div>
<div style="orphans:2;widows:2;">
<pre style="font-family:SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:13.6px;margin-top:0px;margin-bottom:0px;word-wrap:normal;padding:16px;overflow:auto;line-height:1.45;background-color:rgb(246, 248, 250);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(36, 41, 46);"><span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">muldiv</span>(<span class="yiv5021183183pl-smi" style="">First</span>, <span class="yiv5021183183pl-smi" style="">Second</span>) <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">-></span>
<span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">do@</span>([<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">esugar_do_transform_error</span> ||
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">case</span> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">is_integer</span>(<span class="yiv5021183183pl-smi" style="">First</span>) <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">of</span>
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">true</span> -> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">return</span>(<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">next</span>);
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">false</span> -> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">fail</span>(<span class="yiv5021183183pl-s" style="color:rgb(3, 47, 98);"><span class="yiv5021183183pl-pds" style="">"</span>First must be an integer!<span class="yiv5021183183pl-pds" style="">"</span></span>)
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">end</span>,
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">case</span> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">is_integer</span>(<span class="yiv5021183183pl-smi" style="">Second</span>) <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">of</span>
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">true</span> -> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">return</span>(<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">next</span>);
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">false</span> -> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">fail</span>(<span class="yiv5021183183pl-s" style="color:rgb(3, 47, 98);"><span class="yiv5021183183pl-pds" style="">"</span>Second must be an integer!<span class="yiv5021183183pl-pds" style="">"</span></span>)
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">end</span>,
<span class="yiv5021183183pl-smi" style="">Product</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">=</span> <span class="yiv5021183183pl-smi" style="">First</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">*</span> <span class="yiv5021183183pl-smi" style="">Second</span>,
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">case</span> <span class="yiv5021183183pl-smi" style="">Second</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">=/=</span> <span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">0</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">of</span>
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">true</span> -> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">return</span>(<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">next</span>);
<span class="yiv5021183183pl-c1" style="color:rgb(0, 92, 197);">false</span> -> <span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">fail</span>(<span class="yiv5021183183pl-s" style="color:rgb(3, 47, 98);"><span class="yiv5021183183pl-pds" style="">"</span>Second must not be zero!<span class="yiv5021183183pl-pds" style="">"</span></span>)
<span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">end</span>,
<span class="yiv5021183183pl-smi" style="">Quotient</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">=</span> <span class="yiv5021183183pl-smi" style="">First</span> <span class="yiv5021183183pl-k" style="color:rgb(215, 58, 73);">div</span> <span class="yiv5021183183pl-smi" style="">Second</span>,
<span class="yiv5021183183pl-en" style="color:rgb(111, 66, 193);">return</span>({<span class="yiv5021183183pl-smi" style="">Product</span>, <span class="yiv5021183183pl-smi" style="">Quotient</span>})
]).</pre>
</div>
<div style="orphans:2;widows:2;"><span style="font-size:10.5pt;line-height:19px;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e"><br clear="none">
</font></span></div>
<div style="orphans:2;widows:2;"><span style="font-size:10.5pt;line-height:19px;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e">This
idea came from the Haskell's do grammer, and to use this
grammer, you just need to write a error monad.</font></span></div>
<div style="orphans:2;widows:2;"><span style="font-size:10.5pt;line-height:19px;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e"><br clear="none">
</font></span></div>
<div style="orphans:2;widows:2;"><span style="font-size:10.5pt;line-height:19px;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e">This
parse transform code is one module of my esugar(</font></span><span style="font-family:'SFMono-Regular, Consolas, ';font-size:10.5pt;line-height:1.5;background-color:window;">An Erlang Syntactic Sugar Library</span><span style="color:rgb(36, 41, 46);font-family:SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:10.5pt;line-height:19px;">) library, and the address is (</span><span style="font-family:'SFMono-Regular, Consolas, ';font-size:10.5pt;line-height:1.5;background-color:window;"></span><a rel="nofollow" shape="rect" class="yiv5021183183" target="_blank" href="https://github.com/dploop/esugar%29" style="font-family:'';font-size:10.5pt;line-height:1.5;background-color:window;"></a><a rel="nofollow" shape="rect" class="yiv5021183183moz-txt-link-freetext" target="_blank" href="https://github.com/dploop/esugar">https://github.com/dploop/esugar</a>)<span style="font-family:'';font-size:10.5pt;line-height:1.5;background-color:window;"> </span></div>
<span style=""></span>
<div style="orphans:2;widows:2;"><span style="font-size:10.5pt;line-height:19px;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e"><br clear="none">
</font></span></div>
<div style="orphans:2;widows:2;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e"><span style="line-height:19px;">I'm glad to
discuss with you about how to use it or improve it(because I
just write this toy for fun at the begining).</span></font></div>
<div style="orphans:2;widows:2;"><span style="font-size:10.5pt;line-height:19px;"><font face="SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace" color="#24292e"><br clear="none">
</font></span></div>
<div><br clear="none">
</div>
<hr align="left" style="width:210px;min-height:1px;" size="1" color="#b5c4df">
<div><span>
</span><div style="MARGIN:10px;FONT-FAMILY:verdana;FONT-SIZE:10pt;">
<div><a rel="nofollow" shape="rect" class="yiv5021183183moz-txt-link-abbreviated" ymailto="mailto:dploop@163.com" target="_blank" href="mailto:dploop@163.com">dploop@163.com</a></div>
</div>
</div>
<blockquote style="margin-top:0px;margin-bottom:0px;margin-left:0.5em;">
<div> </div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm;">
<div style="PADDING-RIGHT:8px;PADDING-LEFT:8px;FONT-SIZE:12px;FONT-FAMILY:tahoma;COLOR:#000000;BACKGROUND:#efefef;PADDING-BOTTOM:8px;PADDING-TOP:8px;">
<div><b>From:</b> <a rel="nofollow" shape="rect" ymailto="mailto:codewiget95@gmail.com" target="_blank" href="mailto:codewiget95@gmail.com">code wiget</a></div>
<div><b>Date:</b> 2017-09-25 21:25</div>
<div><b>To:</b> <a rel="nofollow" shape="rect" ymailto="mailto:erlang-questions@erlang.org" target="_blank" href="mailto:erlang-questions@erlang.org">Erlang-Questions
Questions</a></div>
<div><b>Subject:</b> [erlang-questions] Nested Case
Statements v.s. multiple functions</div>
</div>
</div>
<div>
<div>Hello everyone,</div>
<div> </div>
<div>As I get further into Erlang, I am starting to realize
that some of my functions have been getting pretty ugly with
nested case statements. For example, I had a nested case
statement that looked something like this:</div>
<div> </div>
<div>Send_update(Arg1) -></div>
<div> case do this(Arg1) of</div>
<div> {ok, [Val1, Val2]} -> </div>
<div> case do_that(Val1, Val2) of</div>
<div> {ok, [Val3, Val4]} -></div>
<div> case do_this2(…) of </div>
<div>….</div>
<div> </div>
<div>It continued into this for another few functions, you get
the picture - its ugly, and it is hard to read. </div>
<div> </div>
<div>So I went and I converted it to a top level function that
would then call lower level functions like so:</div>
<div> </div>
<div> </div>
<div> </div>
<div> send_update(Arg1) -> </div>
<div> case ... of</div>
<div> {ok, [Val1, Val2]} -> </div>
<div> send_update(check_indices, {Arg1, Val1,
Val2});</div>
<div> Else -> </div>
<div> lager:error("ERROR: ..")</div>
<div> end.</div>
<div> send_update(check_indices, {Arg1, Arg2, Arg3}) -></div>
<div> case check_indices(Arg2, Arg3)of </div>
<div> true -></div>
<div> send_update(get_values, {Arg1, Arg3});</div>
<div> false -></div>
<div> lager:error("EMERGENCY: ….")</div>
<div> end;</div>
<div> send_update(get_values, {Arg1, Arg2}) -></div>
<div> ...</div>
<div> case ... of </div>
<div> {ok, [Val1, Val2, VAl3]} -></div>
<div> send_update(send_value, {Arg1, Val1, Val2,
Val3});</div>
<div> Error -> </div>
<div> lager:error("ERROR: …")</div>
<div> end;</div>
<div> send_update(send_value, {Arg1, Arg2, Arg3, Arg4}) -></div>
<div> …</div>
<div> Do_something(Args),</div>
<div> ok. </div>
<div> </div>
<div> </div>
<div>Now that I look at it though, both don’t look right. They
don’t look like something I would write in any other
language where I would just have if’s and else’s.</div>
<div> </div>
<div>Is this the proper way to write Erlang? I know everyone
has their own style, but I assume there is some accepted
form of writing functional programs with deep nests.</div>
<div> </div>
<div>Thank you for your advice!</div>
<div>_______________________________________________</div>
<div>erlang-questions mailing list</div>
<div><a rel="nofollow" shape="rect" class="yiv5021183183moz-txt-link-abbreviated" ymailto="mailto:erlang-questions@erlang.org" target="_blank" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a></div>
<div><a rel="nofollow" shape="rect" class="yiv5021183183moz-txt-link-freetext" target="_blank" href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a></div>
</div>
</blockquote>
<br clear="none">
<fieldset class="yiv5021183183mimeAttachmentHeader"></fieldset>
<br clear="none">
<pre>_______________________________________________
erlang-questions mailing list
<a rel="nofollow" shape="rect" class="yiv5021183183moz-txt-link-abbreviated" ymailto="mailto:erlang-questions@erlang.org" target="_blank" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>
<a rel="nofollow" shape="rect" class="yiv5021183183moz-txt-link-freetext" target="_blank" href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a>
</pre>
</blockquote>
<br clear="none">
</div></div></div></blockquote>
</div></html></div><html><div class="yqt4618319662" id="yqt80695"><body>_______________________________________________<br clear="none">erlang-questions mailing list<br clear="none"><a shape="rect" ymailto="mailto:erlang-questions@erlang.org" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br clear="none"><a shape="rect" href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br clear="none"></body></div></html></div>
</div>
</div></div></body></html>