                        (unread next-ch)
                        next-ch)))))
 
-(defn- string-prefix?
-  "Checks whether the character starts a string"
-  [ch]
-  (= "\"" ch))
-
 (declare read macros dispatch-macros)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; read helpers
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defn macro-terminating? [ch]
+  (and (not= ch "#") (not= ch "\'") (contains? macros ch)))
+
+(defn read-token
+  [rdr initch]
+  (loop [sb (gsb/StringBuffer. initch)
+         ch (read-char rdr)]
+    (if (or (nil? ch)
+            (whitespace? ch)
+            (macro-terminating? ch))
+      (do (unread rdr ch) (.toString gsb))
+      (recur (do (.append sb ch) sb) (read-char rdr)))))
 
 (defn- skip-line
   "Advances the reader to the end of a line. Returns the reader"


(defn read-number
  [reader initch]
  (loop [buffer (gstring/StringBuffer. initch)
         ch (read-char reader)]
    (if (or (nil? ch) (whitespace? ch) (macro? ch))
      (do
        (unread reader ch)
        (match-number (.toString buffer)))

     :default (recur (do (.append buffer ch) buffer) (read-char reader)))))

(defn read-symbol
  [reader initch]
  (let [token (read-token reader initch)]
    (if (gstring/contains token "/")
      (symbol (subs token 0 (.indexOf token "/"))
              (subs (inc (.indexOf token "/")) (.length token)))
      (symbol token))))

(defn read-keyword
  [reader initch]
  (let [token (read-token reader (read-char reader))]
    (if (gstring/contains token "/")
      (keyword (subs token 0 (.indexOf token "/"))
              (subs (inc (.indexOf token "/")) (.length token)))
      (keyword token))))

(defn desugar-meta
  [f]
