   "Creates an InputStreamReader from an InputString"
   [is]
   (InputStreamReader. is nil))
+
+(defn input-stream-push-back-reader
+  "Creates a PushbackReader from a given InputString"
+  ([is]
+     (input-stream-push-back-reader is 1))
+  ([^InputStream is buf-len]
+     (PushbackReader. (input-stream-reader is) (object-array buf-len) buf-len buf-len)))
 
 (defn indexing-push-back-reader
   "Creates an IndexingPushbackReader from a given string"

  (if arg-env
    (throw (IllegalStateException. "Nested #()s are not allowed")))
  (with-bindings {#'arg-env (sorted-map)}
                 (unread rdr \()
                 (let [form (read rdr true nil true) ;; this sets bindings
                       rargs (rseq arg-env)
                       args (if rargs
                              (let [higharg (key (first rargs))]
                                (if (pos? higharg)
                                  (let [args (loop [i 1 args (transient [])]
                                               (if (> i higharg)
                                                 (persistent! args)
                                                 (recur (inc i) (conj! args (or (get arg-env i)
                                                                                (garg i))))))
                                        args (if (arg-env -1)
                                               (conj args '& (arg-env -1))
                                               args)]
                                    args)))
                              [])]
                   (list 'fn* args form))))

(defn register-arg [n]
  (if arg-env

(defn read-syntax-quote
  [rdr backquote]
  (with-bindings {#'gensym-env {}}
    (-> (read rdr true nil true)
        syntax-quote)))

(defn macros [ch]
  (let [c (char ch)]
