git.fiddlerwoaroof.com
Raw Blame History
(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))))