Skip to content

Instantly share code, notes, and snippets.

@pascalc
Created June 12, 2012 22:28
Show Gist options
  • Save pascalc/2920519 to your computer and use it in GitHub Desktop.
Save pascalc/2920519 to your computer and use it in GitHub Desktop.
Himera - Compile CLJS in a custom namespace
;; Handler
(ns ttmachines.server.views.repl-service ...)
...
(defpage [:post "/compile"] {:keys [expr cljs-ns] :or {cljs-ns "cljs.user"}}
(let [cljs-ns (symbol cljs-ns)]
(try
(generate-repl-response (cljs/compilation expr :cljs-ns cljs-ns))
(catch RuntimeException e
(generate-repl-response {:result nil} 400)))))
;; Service
(ns himera.server.cljs
(:require [cljs.compiler :as comp])
(:require [himera.server.setup :as setup])
(:import [java.io PushbackReader BufferedReader StringReader]
[clojure.lang ISeq]))
(declare exp)
(defn build [action locals expr & {:keys [opt pp] :or {opt :simple pp false}}]
{:result
(let [env {:ns (@comp/namespaces comp/*cljs-ns*)
:uses #{'cljs.core}
:context :expr
:locals locals}]
(with-redefs [comp/get-expander exp]
(action env expr)))
:status 200})
(defn compilation [expr & {:keys [cljs-ns]}]
(binding [comp/*cljs-ns* cljs-ns]
(build
#(comp/emits (comp/analyze % %2))
(setup/load-core-names)
expr)))
;; privates
(defn- exp [sym env]
(let [mvar
(when-not (or (-> env :locals sym) ;locals hide macros
(-> env :ns :excludes sym))
(if-let [nstr (namespace sym)]
(when-let [ns (cond
(= "clojure.core" nstr) (find-ns 'cljs.core)
(.contains nstr ".") (find-ns (symbol nstr))
:else
(-> env :ns :requires-macros (get (symbol nstr))))]
(.findInternedVar ^clojure.lang.Namespace ns (symbol (name sym))))
(if-let [nsym (-> env :ns :uses-macros sym)]
(.findInternedVar ^clojure.lang.Namespace (find-ns nsym) sym)
(.findInternedVar ^clojure.lang.Namespace (find-ns 'cljs.core) sym))))]
(println [sym mvar])
(let [sym (symbol (.getName sym))]
(when (and mvar (or (setup/clojure-macros sym) (setup/cljs-macros sym)))
@mvar))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment