git.fiddlerwoaroof.com
postscript-interp.lisp
1a481a69
 (defpackage :lispostscript
   (:use :cl :alexandria :serapeum))
 (in-package :lispostscript)
 
 (defclass operator ()
   ())
 
 (defclass environment ()
   ((&operators :initarg :operators :initform (make-hash-table))
    (&parent :initarg :parent :initform nil)))
 
 (defgeneric op-stack-size (operator))
 
 (defgeneric lookup-name (environment name)
   (:method-combination append))
 
 (defmethod)
 
 (defgeneric execute-op (op &rest args)
   )
 
 (defun un-rpn (list environment)
   (loop with stack = (list)
      for token in list
      if (and (symbolp token)
 	     (not (keywordp token)))
      do (let ((op (lookup-name environment token)))
 	  (typecase op
 	    (operator (let ((op-call (list)))
 			(dotimes (n (op-stack-size op))
 			  (push (pop stack) op-call))
 			(push op stack)
 			(push 'execute-op stack)))
 	    (t (push op stack))))
      else do (push token stack)
      finally (return stack)))