|
22 | 22 | (-put [this k f])
|
23 | 23 | (-tear-down [this]))
|
24 | 24 |
|
| 25 | +(defn load-namespace |
| 26 | + "Load a namespace and all of its dependencies into the evaluation environment. |
| 27 | + The environment is responsible for ensuring that each namespace is loaded once and |
| 28 | + only once." |
| 29 | + [repl-env sym] |
| 30 | + (let [sym (if (and (seq? sym) |
| 31 | + (= (first sym) 'quote)) |
| 32 | + (second sym) |
| 33 | + sym) |
| 34 | + opts {:output-dir (get repl-env :working-dir ".repl")} |
| 35 | + deps (->> (cljsc/add-dependencies opts {:requires [(name sym)] :type :seed}) |
| 36 | + (remove (comp #{["goog"]} :provides)) |
| 37 | + (remove (comp #{:seed} :type)) |
| 38 | + (map #(select-keys % [:provides :url])))] |
| 39 | + (doseq [{:keys [url provides]} deps] |
| 40 | + (-load repl-env provides url)))) |
| 41 | + |
| 42 | +(defn- load-dependencies |
| 43 | + [repl-env requires] |
| 44 | + (doseq [ns requires] |
| 45 | + (load-namespace repl-env ns))) |
| 46 | + |
25 | 47 | (defn evaluate-form
|
26 | 48 | [repl-env env form]
|
27 | 49 | (try
|
28 | 50 | (let [ast (comp/analyze env form)
|
29 | 51 | js (comp/emits ast)]
|
| 52 | + (when (= (:op ast) :ns) |
| 53 | + (load-dependencies repl-env (vals (:requires ast)))) |
30 | 54 | (when *cljs-verbose*
|
31 | 55 | (print js))
|
32 | 56 | (let [ret (-evaluate repl-env (:line (meta form)) js)]
|
|
35 | 59 | ;;TODO - file bug with google, this is bs error
|
36 | 60 | ;;this is what you get when you try to 'teach new developers'
|
37 | 61 | ;;via errors (goog/base.js 104)
|
38 |
| - :error (when-not (and (seq? form) (= 'ns (first form))) |
| 62 | + :error (when-not (and (seq? form) (= 'ns (first form))) ;; dry |
39 | 63 | (println (:value ret))
|
40 | 64 | (when-let [st (:stacktrace ret)]
|
41 | 65 | (println st)))
|
|
68 | 92 | (-put repl-env :filename f)
|
69 | 93 | (load-stream repl-env res))))
|
70 | 94 |
|
71 |
| -(defn load-namespace |
72 |
| - [repl-env sym] |
73 |
| - (let [sym (if (and (seq? sym) |
74 |
| - (= (first sym) 'quote)) |
75 |
| - (second sym) |
76 |
| - sym) |
77 |
| - opts {:output-dir (get repl-env :working-dir ".repl")} |
78 |
| - deps (->> (cljsc/add-dependencies opts {:requires [(name sym)] :type :seed}) |
79 |
| - (remove (comp #{["goog"]} :provides)) |
80 |
| - (remove (comp #{:seed} :type)) |
81 |
| - (map #(select-keys % [:provides :url])))] |
82 |
| - (doseq [{:keys [url provides]} deps] |
83 |
| - (-load repl-env provides url)))) |
84 |
| - |
85 | 95 | (defn repl
|
86 | 96 | "Note - repl will reload core.cljs every time, even if supplied old repl-env"
|
87 | 97 | [repl-env & {:keys [verbose warn-on-undeclared]}]
|
|
0 commit comments