Skip to content

Instantly share code, notes, and snippets.

@brentonashworth
Created February 20, 2012 13:45
Show Gist options
  • Save brentonashworth/1869272 to your computer and use it in GitHub Desktop.
Save brentonashworth/1869272 to your computer and use it in GitHub Desktop.
(def default-special-fns
(let [load-file-fn (fn [repl-env file] (load-file repl-env file))]
{'in-ns (fn [_ quoted-ns] (set! comp/*cljs-ns* (second quoted-ns)))
'load-file load-file-fn
'clojure.core/load-file load-file-fn
'load-namespace (fn [repl-env ns] (load-namespace repl-env ns))}))
(defn repl
"Note - repl will reload core.cljs every time, even if supplied old repl-env"
[repl-env & {:keys [verbose warn-on-undeclared special-fns]}]
(prn "Type: " :cljs/quit " to quit")
(binding [comp/*cljs-ns* 'cljs.user
*cljs-verbose* verbose
comp/*cljs-warn-on-undeclared* warn-on-undeclared]
(let [env {:context :statement :locals {}}
special-fns (merge default-special-fns special-fns)
is-special-fn? (set (keys special-fns))]
(-setup repl-env)
(loop []
(print (str "ClojureScript:" comp/*cljs-ns* "> "))
(flush)
(let [{:keys [status form]} (read-next-form)]
(cond
(= form :cljs/quit) :quit
(= status :error) (recur)
(and (seq? form) (is-special-fn? (first form)))
(do (apply (get special-fns (first form)) repl-env (rest form)) (newline) (recur))
:else
(do (eval-and-print repl-env env form) (recur)))))
(-tear-down repl-env))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment