diff options
author | Chouser <chouser@n01se.net> | 2008-11-01 05:55:06 +0000 |
---|---|---|
committer | Chouser <chouser@n01se.net> | 2008-11-01 05:55:06 +0000 |
commit | 21885ba35e8c3fde17e25872b9562e6d28894db0 (patch) | |
tree | 1214021e70e57a4ca439f9d75abd27669d88378f /clojurescript/repl.cljs | |
parent | 898cedd75b5bf44446e49aaeb614a091cf20e84b (diff) |
ClojureScript: Added "real" symbols, regex literals, re-wrote browser REPL in ClojureScript, updated to Clojure SVN 1086
Diffstat (limited to 'clojurescript/repl.cljs')
-rw-r--r-- | clojurescript/repl.cljs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/clojurescript/repl.cljs b/clojurescript/repl.cljs new file mode 100644 index 00000000..bb087015 --- /dev/null +++ b/clojurescript/repl.cljs @@ -0,0 +1,74 @@ +(ns jsrepl) + +(def append-dom) + +(defn dom [o] + (if (coll? o) + (let [[tag attrs & body] o] + (cond + (coll? tag) (mapcat dom o) + (keyword? tag) + (let [elem (.createElement document (name tag))] + (when (map? attrs) + (doseq [k v] attrs + (.setAttribute elem (name k) v))) + [(append-dom elem (if (map? attrs) body (cons attrs body)))]) + :else (lazy-cons (.createTextNode document (str (first o))) + (dom (rest o))))) + [(.createTextNode document (str o))])) + +(defn append-dom [parent v] + (doseq i (dom v) + (.appendChild parent i)) + parent) + +(def elems) + +(defn repl-print [text] + (let [log (:log elems)] + (doseq line (.split text #"\n") + (append-dom log [:div {:class "cg"} line])) + (set! (.scrollTop log) (.scrollHeight log)))) + +(defn postexpr [] + (append-dom (:log elems) + [:table + [:tbody + [:tr + [:td {:class "cg"} "user=> "] + [:td (-> :input elems .value (.replace #"\n$" ""))]]]]) + (set! (-> :scripts elems .innerHTML) "") + (set! (-> :input elems .value) "")) + +(defn state [status, msg] + (set! (.innerHTML (:status elems)) status) + (cond + (= status "error") (do (postexpr) (print msg)) + (= status "compiled") (postexpr))) + +(defn err [e] + (println e) + (set! *e e)) + +(set! *print-length* 103) + +(set! (.onload window) (fn [] + ; no refs yet, so just re-def + (set! elems (into {} (for [n '(log input status scripts)] + [(keyword n) (.getElementById document (str n))]))) + + (set! (.print window) repl-print) + + (set! (.onkeypress (:input elems)) + (fn [e] + (let [e (or e event)] + (when (== (.keyCode e) 13) + (let [s (.createElement document "script")] + (set! (.src s) (str "http://localhost:8081/" + (-> :input elems .value escape + (.replace #"\+" "%2b")))) + (.appendChild (:scripts elems) s)))))) + + (println "ClojureScript") + + (.focus (:input elems)))) |