[erlang-questions] bad_return_from_state_function on "3.21 Complex State” of "OTP design principles"
by
by@REDACTED
Wed Dec 13 09:28:21 CET 2017
Yes, it works with:
[Digit|Rest] ->
{keep_state, Data#{remaining := Rest},
[30000, {reply, From, ok}]};
Thanks
by
> 在 2017年12月13日,16:19,Guilherme Andrade <g@REDACTED> 写道:
>
> It seems to be a typo. I believe the intention is to set up an event timeout[1] of 30 seconds, but if so then the timeout interval should be bundled with the call reply - "{reply,From,ok}" - in order to make it a part of the list of actions to perform.
>
> Maybe the following will do the trick:
>
> {keep_state, Data#{remaining := Rest}, [30000, {reply,From,ok}]}
>
> [1]: http://erlang.org/doc/man/gen_statem.html#type-event_timeout <http://erlang.org/doc/man/gen_statem.html#type-event_timeout>
>
> On 13 December 2017 at 08:01, by <by@REDACTED <mailto:by@REDACTED>> wrote:
> Hi,
>
> I am trying the example on http://erlang.org/doc/design_principles/statem.html#id77558 <http://erlang.org/doc/design_principles/statem.html#id77558>
> "3.21 Complex State”
>
> But I got exception below:
> ====================================
> Erlang/OTP 20 [erts-9.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
>
> Eshell V9.0 (abort with ^G)
> 1> c(code_lock3).
> {ok,code_lock3}
> 2> code_lock3:start_link([1,2,3], 4).
> Locked
> {ok,<0.67.0>}
> 3> code_lock3:button(1).
> Locked
> ** exception exit: {bad_return_from_state_function,
> {keep_state,
> #{code => [1,2,3],remaining => [2,3]},
> 30000,
> [{reply,
> {<0.60.0>,#Ref<0.235851222.49545217.215838>},
> ok}]}}
> in function gen_statem:parse_event_result/8 (gen_statem.erl, line 1318)
> in call from gen_statem:loop_event/6 (gen_statem.erl, line 1015)
> in call from proc_lib:init_p_do_apply/3 (proc_lib.erl, line 247)
> 4>
> =ERROR REPORT==== 13-Dec-2017::15:46:09 ===
> ** State machine code_lock3 terminating
> ** Last event = {{call,{<0.60.0>,#Ref<0.235851222.49545217.215838>}},
> {button,1}}
> ** When server state = {{locked,4},#{}}
> ** Reason for termination = error:{bad_return_from_state_function,
> {keep_state,
> #{code => [1,2,3],remaining => [2,3]},
> 30000,
> [{reply,
> {<0.60.0>,
> #Ref<0.235851222.49545217.215838>},
> ok}]}}
> ** Callback mode = [handle_event_function,state_enter]
> ** Stacktrace =
> ** [{gen_statem,parse_event_result,8,[{file,"gen_statem.erl"},{line,1318}]},
> {gen_statem,loop_event,6,[{file,"gen_statem.erl"},{line,1015}]},
> {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]
> ====================================
>
> I think the problem is on this:
> [Digit|Rest] -> % Incomplete
> {keep_state, Data#{remaining := Rest, 30000},
> [{reply,From,ok}]};
> Change code to below got the **exception
> [Digit|Rest] -> % Incomplete
> {keep_state, Data#{remaining := Rest}, 30000,
> [{reply,From,ok}]};
>
> Actually, this is apparently wrong, since the map can not got “30000" in this case. I tried move “30000" out of the map, then the above exception occurs.
> And, I also tried just remove the “30000”, and it works fine.
> [Digit|Rest] -> % Incomplete
> {keep_state, Data#{remaining := Rest},
> [{reply,From,ok}]};
>
> My question is:
> Is this a typo in the documentation?
> Or
> Am I missing something?
>
> Thanks
> by
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED <mailto:erlang-questions@REDACTED>
> http://erlang.org/mailman/listinfo/erlang-questions <http://erlang.org/mailman/listinfo/erlang-questions>
>
>
>
>
> --
> Guilherme
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20171213/2752c9dc/attachment.htm>
More information about the erlang-questions
mailing list