(defpackage :fwoar.state (:use :cl)) (defun state-machine () (declare (optimize (debug 3))) (labels ((backslash (char)) (open-parens (char) (case char (#\) (list (list :paren) 'default t t)) (t (list (list :char char) 'open-parens nil t)))) (quote% (char)) (default (char) (case char (#\( (list (list :paren) 'open-parens nil t)) (t (list (list :char char) 'default nil t))))) (loop with state = 'default with result = (make-array 10 :adjustable t :fill-pointer 0) for next-char = (peek-char nil *standard-input* nil :eof) for (out next-state finished advance) = (funcall state next-char) until (or finished (eq next-char :eof) (null next-state)) when advance do (read-char *standard-input* nil :eof) when out do (vector-push-extend out result) do (setf state next-state) finally (return result))))