   [& strings]
   (throw (IllegalArgumentException. #^String (apply str strings))))
 
-(defmacro with-profiled-fns [fns & body]
+(defmacro with-profiled-fns
+  "Runs code in body with all given functions being profiled."
+  [fns & body]
   `(binding ~(vec (apply concat
 			 (for [fn (distinct fns)]
 			   `[~fn (let [orig-fn# ~fn]

  (compile 'conexp.gui.repl)
  nil)

;;; Types

; work over this and make it more flexible
; we may need our own hierachy?

(defn math-type
  "Dispatch function for multimethods. Identifies sets and sequences

	  {}
	  keys))

(defn hash-from-attributes
  "Computes a hash value from the values returned from funs applied to this."
  [this funs]
  (reduce bit-xor 0 (map #(%1 this) funs)))


;;; Swings

(defn get-root-cause
  "Returns original message of first exception causing the given one."
