 (declare newline?)
 
 (defn- normalize-newline [rdr ch]
-  (let [ch (char ch)]
-    (if (identical? \return ch)
-      (let [c (char (peek-char rdr))]
-        (when (identical? \formfeed c)
-          (read-char rdr))
-        \newline)
-      ch)))
+  (if (identical? \return ch)
+    (let [c (peek-char rdr)]
+      (when (identical? \formfeed c)
+        (read-char rdr))
+      \newline)
+    ch))
 
 (deftype IndexingPushbackReader
     [rdr ^:unsynchronized-mutable line ^:unsynchronized-mutable column
      ^:unsynchronized-mutable line-start? ^:unsynchronized-mutable prev]
   Reader
   (read-char [reader]
-    (when-let [ch (char (read-char rdr))]
+    (when-let [ch (read-char rdr)]
       (let [ch (normalize-newline rdr ch)]
         (set! prev line-start?)
         (set! line-start? (newline? ch))

               (let [d (Character/digit ^char ch ^int base)]
                 (read-char rdr)
                 (if (== d -1)
                   (throw (IllegalArgumentException. (str "Invalid digit: " (char ch))))
                   (recur (inc i) (long (* uc (+ base d))))))))
           (char uc))))))


  ([reader eof-error? sentinel] (read reader eof-error? sentinel false))
  ([^blind.reader.IPushbackReader reader eof-error? sentinel recursive?]
     (try
       (let [ch (read-char reader)]
         (cond
            (nil? ch) (if eof-error? (reader-error reader "EOF") sentinel)
            (whitespace? ch) (read reader eof-error? sentinel recursive?)
