      :default (recur (do (.append buffer ch) buffer) (read-char reader)))))
 
 (defn read-symbol
-  [reader initch is-recursive])
+  [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]

        (with-meta o (merge (meta o) m))
        (throw "Metadata can only be applied to IWithMetas")))))

#_(defn read-token
  [rdr initch]
  (let [sb (gsb/StringBuffer. initch)]
    (loop [ch (read-char rdr)]
      (if (or (nil? ch)
              (whitespace? ch)
              (macro-terminating? ch))
        (do (unread rdr ch) s)
        (recur (.append sb ch))))))

(def macros
  { \" read-string
    \; not-implemented ;; never hit this
    \' not-implemented
    \@ not-implemented
    \^ read-meta
    \` not-implemented
    \~ not-implemented
    \( read-list
    \) read-unmatched-delimiter
    \[ read-vector
    \] read-unmatched-delimiter
    \{ read-map
    \} read-unmatched-delimiter
    \\ read-char
    \% not-implemented
    \# read-dispatch
    })

(def dispatch-macros
  {"{" read-set})


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