diff options
author | Chouser <chouser@n01se.net> | 2008-10-15 05:23:39 +0000 |
---|---|---|
committer | Chouser <chouser@n01se.net> | 2008-10-15 05:23:39 +0000 |
commit | ba31da0866de0a825ac2a7d7ddeec7b145ddfd63 (patch) | |
tree | 9a26d19d8b01c35948e5a3cf3accc65514cf467a | |
parent | 5e53e7aca850e8937bdbf0f0194371c50fa36258 (diff) |
ClojureScript: add a minimal HTTP server for compiling cljs to js
-rw-r--r-- | clojurescript/clj.js | 7 | ||||
-rw-r--r-- | clojurescript/tojs.clj | 55 |
2 files changed, 44 insertions, 18 deletions
diff --git a/clojurescript/clj.js b/clojurescript/clj.js index 887aade5..b5c1a84e 100644 --- a/clojurescript/clj.js +++ b/clojurescript/clj.js @@ -427,7 +427,11 @@ clojure = new clojure.lang.Namespace("clojure",{ return c.classname; if( "name" in c ) return c.name; - return "" + c; + var s = "" + c, + m = /^\[JavaClass (.*)]$/.exec(s); + if( m ) + return m[1]; + return s; }, } } @@ -1904,6 +1908,7 @@ clojure.print_method = new clojure.lang.MultiFn( clojure.JS.relayMethod( clojure.print_method, Number, java.lang.Number ); clojure.JS.relayMethod( clojure.print_method, String, java.lang.String, function(o) { return new clojure.JS.String(o); } ); +clojure.JS.relayMethod( clojure.print_method, clojure.JS.Class, java.lang.Class ); clojure.JS.def(clojure,"_STAR_print_readably_STAR_",true); diff --git a/clojurescript/tojs.clj b/clojurescript/tojs.clj index b821e0e8..029beadc 100644 --- a/clojurescript/tojs.clj +++ b/clojurescript/tojs.clj @@ -10,7 +10,9 @@ (ns tojs (:import (clojure.lang Compiler Compiler$C Compiler$BodyExpr - Compiler$DefExpr Compiler$InstanceMethodExpr)) + Compiler$DefExpr Compiler$InstanceMethodExpr) + (java.io BufferedReader InputStreamReader StringReader PrintWriter) + (java.net URLDecoder)) (:require [clojure.contrib.duck-streams :as ds])) (defn vstr [v] @@ -306,24 +308,25 @@ (defn filetojs [filename] (let [reader (java.io.PushbackReader. (ds/reader filename))] - (binding [*ns* (create-ns 'tmp)] + (binding [*ns* (create-ns 'user)] (loop [] - (when-let f (try (read reader) (catch Exception e nil)) - (if-let js (formtojs f) - (do + (let [f (read reader false reader false)] + (when-not (identical? f reader) + (if-let js (formtojs f) + (do + (when *debug-comments* + (println "\n//======") + (print "//") + (prn f) + (println "//---")) + (println js) + (when (or (= 'ns (first f)) + (= 'in-ns (first f))) + (eval f))) (when *debug-comments* - (println "\n//======") - (print "//") - (prn f) - (println "//---")) - (println (formtojs f)) - (when (or (= 'ns (first f)) - (= 'in-ns (first f))) - (eval f))) - (when *debug-comments* - (print "// Skipping: ") - (prn f))) - (recur)))))) + (print "// Skipping: ") + (prn f))) + (recur))))))) (defn simple-tests [] (println (formtojs @@ -355,6 +358,24 @@ (println (formtojs '(fn forever[] (forever)))) (println (formtojs '(fn forever[] (loop [] (recur)))))) +(defn serve [port] + (loop [server (java.net.ServerSocket. port)] + (with-open socket (.accept server) + (binding [*out* (-> socket .getOutputStream ds/writer)] + (try + (print "HTTP/1.0 200 OK\nContent-Type: text/javascript\n\n") + (let [line1 (-> socket .getInputStream ds/reader .readLine) + [_ url] (re-find #"^GET /(.*?) HTTP" line1) + codestr (str "(prn " (URLDecoder/decode url) ")")] + (filetojs (StringReader. codestr))) + (catch Exception e + (println "clojure.prn(\"") + (.printStackTrace e (PrintWriter. *out*)) + (println "\");"))))) + (recur server))) + ;(simple-tests) +;(serve 8080) + (filetojs (first *command-line-args*)) |