aboutsummaryrefslogtreecommitdiff
path: root/clojurescript/repl.cljs
diff options
context:
space:
mode:
authorChouser <chouser@n01se.net>2008-11-01 05:55:06 +0000
committerChouser <chouser@n01se.net>2008-11-01 05:55:06 +0000
commit21885ba35e8c3fde17e25872b9562e6d28894db0 (patch)
tree1214021e70e57a4ca439f9d75abd27669d88378f /clojurescript/repl.cljs
parent898cedd75b5bf44446e49aaeb614a091cf20e84b (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.cljs74
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))))