;;;; methods.lisp (in-package #:tagbody-scaffold) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Protocol classes (p:define-protocol-class state-machine () ()) (p:define-protocol-class state () ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Protocol functions (defgeneric find-state-machine (name &optional errorp) (:documentation "")) (defgeneric (setf find-state-machine) (new-value name &optional errorp)) (defgeneric find-state (state-machine name &optional errorp)) (defgeneric state-machine-name (state-machine)) (defgeneric (setf state-machine-name) (new-value state-machine)) (defgeneric state-machine-variables (state-machine)) (defgeneric (setf state-machine-variables) (new-value state-machine)) (defgeneric state-machine-states (state-machine)) (defgeneric (setf state-machine-states) (new-value state-machine)) (defgeneric state-machine-default-starting-state (state-machine)) (defgeneric (setf state-machine-default-starting-state) (new-value state-machine)) (defgeneric state-machine-transitions (state-machine state)) (defgeneric (setf state-machine-transitions) (new-value state-machine state)) (defgeneric state-name (state)) (defgeneric state-body (state)) (defgeneric add-state (state-machine state)) (defgeneric remove-state (state-machine state)) (defgeneric compile-state-machine (state-machine bindings)) (defgeneric compile-state (state-machine state bindings)) (defgeneric ensure-state-machine-using-class (state-machine name variables transitions options)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Functions and macros (defun ensure-state-machine (name &key variables transitions options) (ensure-state-machine-using-class (find-state-machine name nil) name variables transitions options)) (defmacro expand-state-machine (name bindings &key &allow-other-keys) (let ((state-machine (find-state-machine name))) (compile-state-machine state-machine bindings))) (defmacro expand-state (state-machine-name state-name bindings &key &allow-other-keys) (let* ((state-machine (find-state-machine state-machine-name)) (state (find-state state-machine state-name))) (compile-state state-machine state bindings))) (defgeneric %define-state-machine (name variables transitions options)) (defmacro define-state-machine (name (&rest variables) (&rest transitions) &body options) (%define-state-machine name variables transitions options)) (defgeneric %define-state (state-machine-name state-name body)) (defmacro define-state (state-machine-name state-name () &body body) (%define-state state-machine-name state-name body))