Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.99 KB | None | 0 0
  1. -module(sm).
  2. -export([multi_step/1,
  3. multi_steps/1
  4.  
  5. ]).
  6.  
  7. -type instr() :: {push, integer()} | {pop, pos_integer()}.
  8. -type state() :: {non_neg_integer(), [instr()], [integer()]}.
  9.  
  10. -spec step(state()) -> state() | halt | err.
  11. step({PC, Is, S}) ->
  12. case nth(PC, Is) of
  13. none -> err;
  14. {push, X} -> {Is, [X|S]};
  15. {pop, N} ->
  16. case rotate(N, S) of
  17. err -> err;
  18. S1 -> {Is, S1}
  19. end
  20. end;
  21. step({[], _}) -> halt.
  22.  
  23. nth(0, [X|_]) -> X;
  24. nth(N, [_|Xs]) -> nth(N-1, Xs);
  25. nth(_, []) -> none.
  26.  
  27.  
  28. -spec rotate(pos_integer(), list()) -> list() | err.
  29. rotate(N, Xs) -> rotate_(N, [], Xs).
  30.  
  31. rotate_(0, Ys, [_|Xs]) -> Ys ++ Xs;
  32. rotate_(N, Ys, [X|Xs]) -> rotate_(N-1, [X|Ys], Xs);
  33. rotate_(_, _, _) -> err.
  34.  
  35. -spec multi_step(state()) -> [integer()] | err.
  36. multi_step(St = {_, _, S}) ->
  37. case step(St) of
  38. err -> err;
  39. halt -> S;
  40. St2 -> multi_step(St2)
  41. end.
  42.  
  43. -spec multi_steps(state()) -> ok.
  44. multi_steps(St) ->
  45. case multi_step(St) of
  46. err -> ok;
  47. _ -> throw(ok)
  48. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement