   [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 ^PersistentVector read-delimited-list
  [delim rdr recursive?]
  (let [first-line (if (instance? IndexingPushbackReader (class rdr))
                     (get-line-number rdr))]
    (loop [a (transient [])]
      (let [ch (read-past whitespace? rdr)]
        (when-not ch
          (reader-error rdr "EOF while reading"
                        (if first-line
                          (str ", starting at line" first-line))))
        (if (identical? ^char delim ^char  ch)
          (persistent! a)
          (if-let [macrofn (macros ch)]
            (let [mret (macrofn rdr ch)]
              (recur (if-not (= mret rdr) (conj! a mret) a)))
            (do
              (unread rdr ch)
              (let [o (read rdr true nil recursive?)]
                (recur (if-not (= o rdr) (conj! a o) a))))))))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; data structure readers


(defn read-list
  [rdr _]
  (let [[line column] (if (satisfies? IndexingReader rdr)
                        [(get-line-number rdr) (dec (get-column-number rdr))])
        the-list (read-delimited-list \) rdr true)]
    (if (empty? the-list)
