    Note that the function signature of clojure.tools.reader/read-string and
    clojure.tools.reader.edn/read-string is not the same for eof-handling"
   ([s]
-   (when (and s (not (identical? s "")))
-     (read (string-push-back-reader s) true nil)))
+     (read-string {} s))
   ([opts s]
-    (when (and s (not (identical? s ""))))
-     (read (string-push-back-reader s) opts)))
+     (when (and s (not (identical? s "")))
+       (read opts (string-push-back-reader s)))))
 
 (defmacro syntax-quote
   "Macro equivalent to the syntax-quote reader macro (`)."


   Note that the function signature of clojure.tools.reader/read and
   clojure.tools.reader.edn/read is not the same for eof-handling"
  ([] (read *in*))
  ([reader] (read reader true nil nil {} (LinkedList.)))
  ([reader {eof :eof :as opts}] (read reader (not (nil? eof)) eof nil opts (LinkedList.)))
  ([reader eof-error? sentinel] (read reader eof-error? sentinel nil {} (LinkedList.)))
  ([reader eof-error? sentinel opts pending-forms] (read reader eof-error? sentinel nil opts pending-forms))
  ([reader eof-error? sentinel return-on opts pending-forms]

   Returns the object read. If EOF, throws if eof-error? is true.
   Otherwise returns sentinel. If no stream is providen, *in* will be used.

   Opts is a persistent map with valid keys:
    :read-cond - :allow to process reader conditionals, or
                 :preserve to keep all branches
    :features - persistent set of feature keywords for reader conditionals
    :eof - on eof, return value unless :eofthrow, then throw.
           if not specified, will throw

   ***WARNING***
   Note that read can execute code (controlled by *read-eval*),
   and as such should be used only with trusted sources.
