[erlang-questions] : Newbie: Is there a short-circuit for the comma operator?

Raimo Niskanen <>
Wed Oct 10 10:42:54 CEST 2007


On Wed, Oct 10, 2007 at 08:16:13PM +1300, James Cone wrote:
> Hello KatolaZ and Raimo,
> 
> Raimo, I may have miscommunicated; I don't want the returned value; what 
> I'm trying to achieve is to be tail-recursive from the middle of an if, 
> where the non-recursing branches will evaluate another expression, after 
> a comma-operator.  So throw/catch requires that I fail, because the 
> stack frame will still be there, to catch the thrown thing.

In that case the standard solution is to restructure the code,
create a support function See below.


> 
> KatolaZ, I'm trying to write the code below the way I would in C, where 
> you control the nesting depth by making the control-flow leave the 
> function as soon as possible.  It operates correctly in the short term, 
> but is not tail-recursive, so (as expected) the interpreter runs out of 
> memory.
> 
> Regards,
> James.
> 
> KatolaZ wrote:
> > On Wed, Oct 10, 2007 at 07:14:11PM +1300, James Cone wrote:
> >> Is there an operator or function that short-circuits the comma operator, 
> <snip>
> 
> > Such an operator does not exist in erlang. And I've never needed it
> > :-) You should perhaps rewrite your code better. Paste it, and let's
> > see where we can help.
> <snip>
> 
> Raimo Niskanen wrote:
> > Nope. Such a thing does not exist.
> > 
> > But it seems you want to do something that is well suited for throw/1.
> <snip>
> 
> threadWatch(Socket, Label, Expect, Next, StatOn, StatTo, StatStart) ->
>    % Expect and Next are serial numbers in our conversation with the server.
>    % StatOn is the serial number on which to send the performance measure.
>    % StatOn is normally false.  If it is -1, then the next send is the start
>    % of the stats run.  If it is >= 0, then a stats run is in progress,
>    % in which case StatStart (the start time) and StatTo (the stats process)
>    % are defined.
> 
>    receive
> 
>      {tcp, error, _Reason} ->
>        exit(_Reason);
> 
>      {tcp, Socket, Data} ->
>        Colon = string:chr(Data, $:),
>        if
>          0 == Colon ->
>            io:format("Unlabelled: ~p~n", [Data]),
>            threadWatch(Socket, Label, Expect, Next, StatOn, StatTo, 
> StatStart);
>          true ->
>            ok
>        end,
> 
>        InLabel = string:substr(Data, 1, Colon-1),
>        Rest = string:substr(Data, Colon+1),
> 
> %      io:format("Label = '~p', InLabel = '~p'~n", [Label, InLabel]),
> 
>        if
>          InLabel == Label ->
	       threadWatch_1(Socket, Label, Expect, Next,
	                     StatOn, StatTo, StatStart, Data, Rest);
% >            ok;
>          true ->
>            % This line is irrelevant; recurse now
> 
> %%%%
> %%%% I believe the problem is here
> %%%%
>            threadWatch(Socket, Label, Expect, Next,
>                               StatOn, StatTo, StatStart)
%>        end,
         end
    end.
> 
> %%%
> %%%  I want to avoid putting this code inside the
> %%%  control structure above
> %%%
> 

threadWatch_1(Socket, Label, Expect, Next,
              StatOn, StatTo, StatStart, Data, Rest) ->
>        case erl_scan:string(Rest) of
> 
>          {ok, [{integer, 1, Got} |_], _} ->
> 
> %          io:format("Got = ~w, Expect = ~w~n", [Got, Expect]),
> 
>            if
>              Expect == Got ->
> 
>                % This is where all of the important stuff happens.
>                % Most of it is not implemented yet.
> 
>                Sendline = lists:concat([ Next,
> " 
>    \n"]),
>                gen_tcp:send(Socket, Sendline),
> %              io:format("Sent ~p", [Sendline]),
>                threadWatch(Socket, Label, Expect+1, Next+1,
>                            StatOn, StatTo, StatStart)
>              ;
>              true ->
>                exit({badSequence, Data, Expect})
>            end
>          ;
>          _ ->
>            exit({malformedLine, Data})
>        end
> 
>    end.
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions

-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB



More information about the erlang-questions mailing list