   [rdr & msg]
   (throw (ex-info (apply str msg)
                   (merge {:type :reader-exception}
-                         (if (instance? IndexingPushbackReader (class rdr))
+                         (if (satisfies? IndexingReader rdr)
                            {:line (get-line-number rdr)
                             :column (get-column-number rdr)})))))
 
 (defn macro-terminating? [ch]
-  (and (not (identical? \# ^char ch))
-       (not (identical? \' ^char ch))
+  (and (not= \# ch)
+       (not= \' ch)
        ;;(not= ch \:) ;; why?
        (macros ch)))
 
 (defn ^String read-token
   [rdr initch]
-  (if-not initch
+  (if (not initch)
     (reader-error rdr "EOF while reading")
+    
     (loop [sb (doto (StringBuilder.) (.append initch))
            ch (peek-char rdr)]
       (if (or (nil? ch)


(defn- whitespace?
  "Checks whether a given character is whitespace"
  [ch]
  (if ch
    (or (Character/isWhitespace ^char ch) (identical? \, ch))))

(defn- numeric?
  "Checks whether a given character is numeric"
  [ch]
  (if ch
    (Character/isDigit ^char ch)))

(defn- comment-prefix?
  "Checks whether the character begins a comment."
  [ch]
  (identical? \; ^char ch))

(defn- number-literal?
  "Checks whether the reader is at the start of a number literal"
  [reader initch]
  (or (numeric? initch)
      (and (or (identical? \+ ^char initch) (identical? \- ^char initch))
           (numeric? (peek-char reader)))))

(declare read macros dispatch-macros)


(defn read-meta
  [rdr _]
  (let [[line column] (if (satisfies? IndexingReader rdr)
                        [(get-line-number rdr) (dec (get-column-number rdr))])
        m (desugar-meta (read rdr true nil true))]
    (when-not (map? m)
