Advertisement
Guest User

Untitled

a guest
Jun 22nd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 1.01 KB | None | 0 0
  1. %%Пример для вопроса №8: Как запрограммировать на Erlang конечный автомат?
  2. %%"Дверь с кодовым замком"
  3. -module(code_lock).
  4. -behaviour(gen_fsm).
  5.  
  6. -export([start_link/1]).
  7. -export([button/1]).
  8. -export([init/1, locked/2, open/2]).
  9.  
  10. start_link(Code) ->
  11.    gen_fsm:start_link({local, code_lock}, code_lock, Code, []).
  12.  
  13. button(Digit) ->
  14.    gen_fsm:send_event(code_lock, {button, Digit}).
  15.  
  16. init(Code) ->
  17.    {ok, locked, {[], Code}}.
  18.  
  19. locked({button, Digit}, {SoFar, Code}) ->
  20.    case [Digit|SoFar] of
  21.        Code ->
  22.            do_unlock(),
  23.            {next_state, open, {[], Code}, 3000};
  24.        Incomplete when length(Incomplete)<length(Code) ->
  25.            {next_state, locked, {Incomplete, Code}};
  26.        _Wrong ->
  27.            {next_state, locked, {[], Code}}
  28.    end.
  29.  
  30. open(timeout, State) ->
  31.    do_lock(),
  32.    {next_state, locked, State}.
  33.  
  34. do_lock() ->
  35.    io::format("door closed").
  36.  
  37. do_unlock() ->
  38.    io::format("door opened").
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement