+Enumerated constants!
authorAlex Klinkhamer <grencez@gmail.com>
Sat, 12 Jul 2008 23:07:46 +0000 (12 19:07 -0400)
committerAlex Klinkhamer <grencez@gmail.com>
Sat, 12 Jul 2008 23:07:46 +0000 (12 19:07 -0400)
src/infix-parser.lisp

index e98f888..414bb56 100644 (file)
 
 (in-package :lineal)
 
-;;; Should probably handle this more dynamically at compile-time.
+;;; Define variables as constant integers
+(defmacro enumerate-constants (&rest syms &aux (v 0))
+  (declare (integer v))
+  (cons 'progn
+        (mapcar
+          (lambda (k)
+            (unless (symbolp k)
+              (setf (values k v) (values-list k)))
+            (prog1 `(defconstant ,k ,v)
+              (incf v)))
+          syms)))
+
 ;V Set precedence ranks.V
-(defconstant +base-rank+ 0)
-(defconstant +paren-rank+ 1)
-(defconstant +comma-rank+ 2)
-(defconstant +fn-rank+ 3)
-(defconstant +addn-rank+ 4)
-(defconstant +subtrn-rank+ 5)
-(defconstant +multn-rank+ 6)
-(defconstant +divisn-rank+ 7)
-(defconstant +exptn-rank+ 8)
-(defconstant +vip-rank+ 9);< Virtually infinite precedence.
+(enumerate-constants
+  +base-rank+ 
+  +paren-rank+ 
+  +comma-rank+ 
+  +fn-rank+ 
+  +addn-rank+ 
+  +subtrn-rank+ 
+  +multn-rank+
+  +divisn-rank+
+  +exptn-rank+
+  +vip-rank+);< Virtually infinite precedence.
 
 ;;; a b = a*b
 (defun multn-if-last-read ()