 
 (defn read-list
   [rdr _]
-  (let [[line column] (if (instance? IndexingPushbackReader (class 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)


(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

  [rdr & msg]
  (throw (ex-info (apply str msg)
                  (merge {:type :reader-exception}
                         (if (satisfies? IndexingReader rdr)
                           {:line (get-line-number rdr)
                            :column (get-column-number rdr)})))))

(defn macro-terminating? [ch]
  (and (not= \# ch)
       (not= \' ch)
       ;;(not= ch \:) ;; why?
       (macros ch)))

(defn ^String read-token
  [rdr initch]
  (if (not initch)
    (reader-error rdr "EOF while reading")
    
    (loop [sb (doto (StringBuilder.) (.append initch))
           ch (peek-char rdr)]
      (if (or (nil? ch)
