        :*ns*           (create-ns 'cljs.user)
        :*data-readers* tags/*cljs-data-readers*
        :*eval-fn*      (or (:js-eval opts) js/eval)}`
-      source opts cb)))+      source opts cb)))
+
+;; -----------------------------------------------------------------------------
+;; Evaluate String
+
+(defn eval-str* [bound-vars source opts cb]
+  (let [rdr  (rt/string-push-back-reader source)
+        eof  (js-obj)
+        aenv (ana/empty-env)
+        sb   (StringBuffer.)]
+    ((fn compile-loop []
+       (binding [env/*compiler*   (:*compiler* bound-vars)
+                 *eval-fn*        (:*eval-fn* bound-vars)
+                 ana/*cljs-ns*    (:*cljs-ns* bound-vars)
+                 *ns*             (:*ns* bound-vars)
+                 r/*data-readers* (:*data-readers* bound-vars)]
+         (let [form (r/read {:eof eof} rdr)]
+           (if-not (identical? eof form)
+             (let [aenv (assoc aenv :ns (ana/get-namespace ana/*cljs-ns*))
+                   ast  (.append sb (comp/emit (ana/analyze aenv form)))]
+               (if (= :ns (:op ast))
+                 (ns-side-effects bound-vars aenv ast opts
+                   (fn [_] (compile-loop)))
+                 (recur)))
+             (cb (.toString cb)))))))))
+
+(defn eval-str
+  ([env source cb] (eval-str env source cb))
+  ([env source opts cb]
+   (eval-str*
+     {:*compiler*     env
+      :*cljs-ns*      'cljs.user
+      :*ns*           (create-ns 'cljs.user)
+      :*data-readers* tags/*cljs-data-readers*
+      :*eval-fn*      (or (:js-eval opts) js/eval)}`
+       source opts cb)))
   (when-not (contains? @*loaded* name)
     (*load-fn* name
       (fn [source]
         (compile* bound-vars source opts (fn [ret] (cb true))))))))

(declare ns-side-effects)


              ana/*cljs-ns*    (:*cljs-ns* bound-vars)
              *ns*             (:*ns* bound-vars)
              r/*data-readers* (:*data-readers* bound-vars)]
      ((fn analyze-loop []
         (let [form (r/read {:eof eof} rdr)]
           (if-not (identical? eof form)
             (let [aenv (assoc aenv :ns (ana/get-namespace ana/*cljs-ns*))
                   ast  (ana/analyze aenv form)]
               (if (= :ns (:op ast))
                 (ns-side-effects bound-vars aenv ast opts
                   (fn [_] (analyze-loop)))
                 (recur)))
             (cb))))))))

(defn analyze-deps
  "Given a lib, a namespace, deps, its dependencies, env, an analysis environment
