git.fiddlerwoaroof.com
state-machine.lisp
1a481a69
 (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))))