         dm (get dispatch-macros ch)]
     (if dm
       (dm rdr _)
-      (throw (str "No dispatch macro for " ch)))))
+      (reader-error rdr "No dispatch macro for " ch))))
 
 (defn read-unmatched-delimiter
   [rdr ch]
-  (throw (str "Unmached delimiter " ch)))
+  (reader-error rdr "Unmached delimiter " ch))
 
 (defn read-list
   [rdr _]
   (apply list (read-delimited-list ")" rdr true)))
+
+(def read-comment skip-line)
 
 (defn read-vector
   [rdr _]

  [rdr _]
  (let [l (read-delimited-list "}" rdr true)]
    (when (odd? (count l))
      (throw "Map literal must contain an even number of forms"))
    (apply hash-map l)))

(defn read-set
  [rdr _]
  (set (read-delimited-list "}" rdr true)))

(defn read-number
  [reader initch]

      (do (unread rdr ch) (. sb (toString)))
      (recur (do (.append sb ch) sb) (read-char rdr)))))

(defn skip-line
  "Advances the reader to the end of a line. Returns the reader"
  [reader _]
  (loop []
    (let [ch (read-char reader)]
      (if (or (= ch \n) (= ch \r) (nil? ch))
        reader
        (recur)))))

(def int-pattern (re-pattern "([-+]?)(?:(0)|([1-9][0-9]*)|0[xX]([0-9A-Fa-f]+)|0([0-7]+)|([1-9][0-9]?)[rR]([0-9A-Za-z]+)|0[0-9]+)(N)?"))
(def ratio-pattern (re-pattern "([-+]?[0-9]+)/([0-9]+)"))
