    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.

   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)))
  ([opts s]
    (when (and s (not (identical? s ""))))
     (read (string-push-back-reader s) opts)))

(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"
  {:arglists '([] [reader] [opts reader] [reader eof-error? eof-value])}
  ([] (read *in*))
  ([reader] (read reader true nil nil {} (LinkedList.)))
  ([{eof :eof :as opts :or {eof :eofthrow}} reader] (read reader (= eof :eofthrow) 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]
