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>