Use State Machines
rclayton.silvrback.com
rclayton.silvrback.com
(define (order-creating-state)
(let loop-within-state ()
(let ((event (get-event)))
(case (event-type event)
((add-item)
(add-item-to-order (event-data event))
(loop-within-state))
((delete-item)
(delete-item-from-order (event-data event))
(loop-within-state))
((finalize)
(order-finalizing-state))
(else (error "order-creating-state: invalid event"))))))
In Scheme you could also decide on your state model, and make the code more maintainable in terms of that state model, by defining a minilanguage or domain-specific language for it: (state order-creating (event)
(add-item (add-item-to-order event))
(delete-item (delete-item-from-order event))
(finalize (transition-to order-finalizing)))