gen_fsm例子:code_lock

阅读更多
改了一下代码,可以run了:
%% code_lock.erl
-module(code_lock).
-behaviour(gen_fsm).

-export([start/1, button/1]).
-export([locked/2, open/2]).
-export([init/1, handle_event/3, handle_sync_event/4, handle_info/3, code_change/4, terminate/3]). 

start(Code) ->
  gen_fsm:start_link({local, code_lock}, code_lock, Code, []).

button(Digit) ->
  gen_fsm:send_event(code_lock, {button, Digit}).

locked({button, Digit}, {SoFar, Code}) ->
  io:format("Now the code you input is: ~w~n", [SoFar ++ [Digit]]),
  case SoFar ++ [Digit] of
    Code ->
      io:format("Open!~n"),
      {next_state, open, {[], Code}, 3000};
    Incomplete when length(Incomplete) < length(Code) ->
      {next_state, locked, {Incomplete, Code}};
    _Wrong ->
      io:format("Wrong Code! Start Again!~n"),
      {next_state, locked, {[], Code}}
  end.

open(timeout, State) ->
  io:format("Lock!~n"),
  {next_state, locked, State}.

init(Code) ->
  {ok, locked, {[], Code}}.

handle_event(_A, _B, _C) ->
  {next_state, ok, ok}.

handle_sync_event(_A, _B, _C, _D) ->
  {reply, ok, ok, ok}.

handle_info(_A, _B, _C) ->
  {next_state, ok, ok}.

code_change(_A, _B, _C, _D) ->
  {ok, ok, ok}.

terminate(_A, _B, _C) ->
  ok.


编译运行:
D:\erl\code>erl
Eshell V5.6.3  (abort with ^G)
1> c(code_lock).
{ok,code_lock}
2> code_lock:start([1,2,3]).
{ok,<0.36.0>}
3> code_lock:button(1).
Now the code you input is: [1]
ok
4> code_lock:button(2).
Now the code you input is: [1,2]
ok
5> code_lock:button(3).
Now the code you input is: [1,2,3]
ok
Open!
6> Lock!
6> code_lock:button(1).
Now the code you input is: [1]
ok
7> code_lock:button(2).
Now the code you input is: [1,2]
ok
8> code_lock:button(2).
Now the code you input is: [1,2,2]
ok
Wrong Code! Start Again!
9>

你可能感兴趣的:(C,C++,C#)