<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoPlainText>For example this is one of the algorithms, I optimize it as well as I could:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Considering here that the order of the fields is very important!.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% -------------------------------------------------------------------<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% @private<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% @doc<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% Parses the specified list of full fields into a string containing<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% all full fields separated my comma.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% example:<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% <pre><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%%   parse_full_fields([{users, '*'}, name, {roles, [id, level]},<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%%       {users, name, alias}], fun get_postgres_operator/2) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%%       {"users.'*',name,roles.id,roles.level,users.name AS alias",<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%%           [users, roles]}.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% </pre><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% Returns `{[], []}' if called with `[]'.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% @throws {error, invalid_return_fields_spec, InvalidForm :: any()}<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% @end<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% -------------------------------------------------------------------<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>-spec parse_return_full_fields(FullFieldsSpecs, Separator, OperatorFinder) -> Str when<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    FullFieldsSpecs :: proplists:proplist(),<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    Separator :: string(),<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    OperatorFinder :: fun(),<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    Str :: string().<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_return_full_fields(FullFieldsSpecs, Separator, OperatorFinder) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    {ParsedFields, TableNames} =<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>        parse_full_fields2(FullFieldsSpecs, [], [], OperatorFinder),<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    {string:join(lists:reverse(ParsedFields), Separator), TableNames}.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% @private<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% base case.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_full_fields2([], ParsedKeys, TableNames, _) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    {ParsedKeys, TableNames};<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% {table_name(), [field_name(), ...]}.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_full_fields2([{TableName, [_FieldName | _] = FieldNames} | Rest],<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    ParsedKeys, TableNames, OperatorFinder) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    %% --><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    NewParsedKeys =<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>        parse_field_names(FieldNames, [], atom_to_list(TableName), OperatorFinder),<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%%         lists:map(fun(FieldName) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%%             atom_to_list(TableName) ++ OperatorFinder('.', special_op)<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%%                 ++ parse_field_name(FieldName, OperatorFinder)<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%%         end, FieldNames),<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    parse_full_fields2(Rest,<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>        NewParsedKeys ++ ParsedKeys, [TableName | TableNames], OperatorFinder);<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% {table_name(), field_name(), field_name_alias()}.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_full_fields2([{TableName, FieldName, Alias} | Rest],<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    ParsedKeys, TableNames, OperatorFinder) when FieldName =/= '*' -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    %% --><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    parse_full_fields2(Rest, [<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>            atom_to_list(TableName) ++ OperatorFinder('.', special_op)<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>            ++ parse_field_name(FieldName, OperatorFinder) ++<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>            " " ++ OperatorFinder('ALIAS', special_op) ++ " " ++ atom_to_list(Alias)<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>        | ParsedKeys], [TableName | TableNames], OperatorFinder);<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% {table_name(), '*', field_name_alias()}. Throws an ERROR!.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_full_fields2([{_TableName, _FieldName, _Alias} = InvalidForm | _], _, _, _) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    erlang:throw({error, {invalid_return_fields_spec, InvalidForm}});<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% {table_name(), field_name()}.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_full_fields2([{TableName, FieldName} | Rest],<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    ParsedKeys, TableNames, OperatorFinder) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    %% --><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    parse_full_fields2(Rest,<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>        [atom_to_list(TableName) ++ OperatorFinder('.', special_op)<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>            ++ parse_field_name(FieldName, OperatorFinder) | ParsedKeys],<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>        [TableName | TableNames], OperatorFinder);<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% [field_name(), ...].<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_full_fields2([FieldName | Rest],<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    ParsedKeys, TableNames, OperatorFinder) when is_atom(FieldName) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    %% --><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    parse_full_fields2(Rest,<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>        [parse_field_name(FieldName, OperatorFinder) | ParsedKeys], TableNames, OperatorFinder);<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% Throws an ERROR! if no valid form is provided.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_full_fields2(InvalidForm, _, _, _) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    erlang:throw({error, {invalid_return_fields_spec, InvalidForm}}).<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% @private<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_field_name('*', OperatorFinder) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    OperatorFinder('*', special_op);<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_field_name(FieldName, _OperatorFinder) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    atom_to_list(FieldName).<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'><o:p> </o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% @private<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_field_names([], ParsedFieldNames, _, _) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    ParsedFieldNames;<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_field_names([FieldName | Rest],<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    ParsedFieldNames, BaseTableName, OperatorFinder) when is_atom(FieldName) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    %% -- ><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    parse_field_names(Rest, [<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>            BaseTableName ++ OperatorFinder('.', special_op)<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>            ++ parse_field_name(FieldName, OperatorFinder)<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>        | ParsedFieldNames], BaseTableName, OperatorFinder);<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>%% throws an ERROR! if no valid form is provided.<o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>parse_field_names(InvalidForm, _, _, _) -><o:p></o:p></span></p><p class=MsoPlainText><span style='font-size:10.0pt;font-family:Consolas'>    erlang:throw({error, {invalid_return_fields_spec, InvalidForm}}).<o:p></o:p></span></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Cheers,<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>-----Original Message-----<br>From: erlang-questions-bounces@erlang.org [mailto:erlang-questions-bounces@erlang.org] On Behalf Of Ivan Carmenates Garcia<br>Sent: Wednesday, October 7, 2015 8:11 PM<br>To: 'Richard A. O'Keefe'<br>Cc: 'Erlang Questions Mailing List'<br>Subject: Re: [erlang-questions] Coming Back (maybe improving lists:reverse/1)</p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Yes that is so, but in my case, I cannot find a better way to improve it, I did it as better could so, that's when Joes words give me pleasure. ;)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Regards,<o:p></o:p></p><p class=MsoPlainText>Ivan (son of Gilberio).<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>-----Original Message-----<o:p></o:p></p><p class=MsoPlainText>From: Richard A. O'Keefe [<a href="mailto:ok@cs.otago.ac.nz"><span style='color:windowtext;text-decoration:none'>mailto:ok@cs.otago.ac.nz</span></a>]<o:p></o:p></p><p class=MsoPlainText>Sent: Wednesday, October 7, 2015 7:51 PM<o:p></o:p></p><p class=MsoPlainText>To: Ivan Carmenates Garcia<o:p></o:p></p><p class=MsoPlainText>Cc: Erik Søe Sørensen; Erlang Questions Mailing List<o:p></o:p></p><p class=MsoPlainText>Subject: Re: [erlang-questions] Coming Back (maybe improving<o:p></o:p></p><p class=MsoPlainText>lists:reverse/1)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>On 8/10/2015, at 11:49 am, Ivan Carmenates Garcia <<a href="mailto:co7eb@frcuba.co.cu"><span style='color:windowtext;text-decoration:none'>co7eb@frcuba.co.cu</span></a>><o:p></o:p></p><p class=MsoPlainText>wrote:<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>> Nice.<o:p></o:p></p><p class=MsoPlainText>>  <o:p></o:p></p><p class=MsoPlainText>> So in order of balance between memory and speed is the best ways as it<o:p></o:p></p><p class=MsoPlainText>is?.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Ill-posed qwuestion.  No answer is possible until you specify best in *what<o:p></o:p></p><p class=MsoPlainText>respect* for *what purpose*.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Doubly linked lists are said to have their uses, but any time I've been<o:p></o:p></p><p class=MsoPlainText>tempted to use them, some other data structure has always turned out to be<o:p></o:p></p><p class=MsoPlainText>much better.  There are actually several different ways to implement singly<o:p></o:p></p><p class=MsoPlainText>linked lists (anyone else out there remember CDR-coding?) more than one of<o:p></o:p></p><p class=MsoPlainText>which could be used for Erlang, so it's even harder to assign any meaning to<o:p></o:p></p><p class=MsoPlainText>the question than you might think.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>For example, I have a library that I've ported to several functional<o:p></o:p></p><p class=MsoPlainText>programming languages providing unrolled lists.  For example,<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>    data URSL t<o:p></o:p></p><p class=MsoPlainText>       = Cons4 t t t t (URSL t)<o:p></o:p></p><p class=MsoPlainText>       | End3 t t t<o:p></o:p></p><p class=MsoPlainText>       | End2 t t <o:p></o:p></p><p class=MsoPlainText>       | End1 t<o:p></o:p></p><p class=MsoPlainText>       | End0<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>This takes 6 words for every 4 elements, an average of 1.5 words per<o:p></o:p></p><p class=MsoPlainText>element.  (A doubly linked list would require at least twice as much.) On<o:p></o:p></p><p class=MsoPlainText>the other hand, it's very bad at prepending a single element.  So unroll<o:p></o:p></p><p class=MsoPlainText>from the _other_ end; that way you need one End but more than one Cons.  <o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>> Okay, sounds good to me, also Joe was saying something that I like some<o:p></o:p></p><p class=MsoPlainText>kind about algorithms optimizations, because I am a little bit hard about<o:p></o:p></p><p class=MsoPlainText>it, but for example in this little framework I am doing for myself and the<o:p></o:p></p><p class=MsoPlainText>community if they like of course there are parts in which maybe I think some<o:p></o:p></p><p class=MsoPlainText>algorithms could be better but if it works and it does quite well, i.e. if<o:p></o:p></p><p class=MsoPlainText>in my computer with one millions of iterations in one process this is<o:p></o:p></p><p class=MsoPlainText>important because each user will have one process for its own, it take 21<o:p></o:p></p><p class=MsoPlainText>seconds to perform and in a core i3 with 2 GB of single channel memory it<o:p></o:p></p><p class=MsoPlainText>take 9 seconds, then in a real server with 64 cores and super memory it will<o:p></o:p></p><p class=MsoPlainText>take none milliseconds to perform so, in the future machines will be better<o:p></o:p></p><p class=MsoPlainText>each time and maybe we don’t have to be so extreme about performance.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>This is extremely vague.  All I can say is<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>    Remember that the BIGGEST performance gains come<o:p></o:p></p><p class=MsoPlainText>    from optimising at the HIGHEST level.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>_______________________________________________<o:p></o:p></p><p class=MsoPlainText>erlang-questions mailing list<o:p></o:p></p><p class=MsoPlainText><a href="mailto:erlang-questions@erlang.org"><span style='color:windowtext;text-decoration:none'>erlang-questions@erlang.org</span></a><o:p></o:p></p><p class=MsoPlainText><a href="http://erlang.org/mailman/listinfo/erlang-questions"><span style='color:windowtext;text-decoration:none'>http://erlang.org/mailman/listinfo/erlang-questions</span></a><o:p></o:p></p></div></body></html>