Finite state machine: Difference between revisions
Content added Content deleted
(added Ol) |
|||
Line 919: | Line 919: | ||
(D)ispense or (Q)uit : q |
(D)ispense or (Q)uit : q |
||
OK, quitting |
OK, quitting |
||
</pre> |
|||
=={{header|Ol}}== |
|||
<lang scheme> |
|||
(import (scheme read)) |
|||
; finite state machine |
|||
(define (state-machine states initial-state) |
|||
(let loop ((state initial-state)) |
|||
(let*((action ((states state) 'enter #f)) |
|||
(process-enter (if (function? action) (action))) |
|||
(next-state (if (symbol? action) action |
|||
else |
|||
((states state) (string->symbol (symbol->string (read))) state)))) |
|||
(loop next-state)))) |
|||
; task states |
|||
(define states { |
|||
'ready { |
|||
'enter (lambda () (print "Write (d)eposit for deposit and (q)uit to exit.")) |
|||
'd 'waiting |
|||
'deposit 'waiting |
|||
'q 'exit |
|||
'quit 'exit |
|||
} |
|||
'exit { |
|||
'enter (lambda () (halt 1)) |
|||
} |
|||
'waiting { |
|||
'enter (lambda () (print "Write (s)elect for dispense or (r)efund for refund.")) |
|||
's 'dispense |
|||
'select 'dispense |
|||
'r 'refunding |
|||
'refund 'refunding |
|||
} |
|||
'dispense { |
|||
'enter (lambda () (print "Write (r)emove to finish action.")) |
|||
'r 'ready |
|||
'remove 'ready |
|||
} |
|||
'refunding { |
|||
'enter 'ready |
|||
} |
|||
}) |
|||
; run |
|||
(state-machine states 'ready) |
|||
</lang> |
|||
{{Out}} |
|||
<pre> |
|||
Write (d)eposit for deposit and (q)uit to exit. |
|||
d |
|||
Write (s)elect for dispense or (r)efund for refund. |
|||
f |
|||
Write (s)elect for dispense or (r)efund for refund. |
|||
f |
|||
Write (s)elect for dispense or (r)efund for refund. |
|||
s |
|||
Write (r)emove to finish action. |
|||
r |
|||
Write (d)eposit for deposit and (q)uit to exit. |
|||
d |
|||
Write (s)elect for dispense or (r)efund for refund. |
|||
s |
|||
Write (r)emove to finish action. |
|||
r |
|||
Write (d)eposit for deposit and (q)uit to exit. |
|||
q |
|||
</pre> |
</pre> |
||