aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChouser <chouser@n01se.net>2008-10-15 05:23:39 +0000
committerChouser <chouser@n01se.net>2008-10-15 05:23:39 +0000
commitba31da0866de0a825ac2a7d7ddeec7b145ddfd63 (patch)
tree9a26d19d8b01c35948e5a3cf3accc65514cf467a
parent5e53e7aca850e8937bdbf0f0194371c50fa36258 (diff)
ClojureScript: add a minimal HTTP server for compiling cljs to js
-rw-r--r--clojurescript/clj.js7
-rw-r--r--clojurescript/tojs.clj55
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*))