Index: trunk/util.lisp
===================================================================
--- trunk/util.lisp	(revision trunk,21)
+++ trunk/util.lisp	(revision trunk,24)
@@ -40,2 +40,17 @@
     ((not ,cond))
     ,@body))
+
+(defmacro symcase (symvar &body clauses)
+  (flet ((is-default (clause)
+	   (string= (symbol-name (first clause)) #.(symbol-name 't))))
+    (let ((symname (gensym))
+	  (default-clause (find-if #'is-default clauses)))
+      `(let ((,symname (symbol-name ,symvar)))
+	(cond
+	  ,@(mapcar (lambda (clause)
+		      (destructuring-bind (sym form) clause
+			`((string= ,symname ,(symbol-name sym)) ,form)))
+		    (remove-if #'is-default clauses))
+	  ,@(when default-clause
+		  (destructuring-bind (sym form) default-clause
+		    `((,sym ,form)))))))))
