lazy namespaces experiment

This commit is contained in:
Michiel Borkent 2020-05-24 23:53:36 +02:00
parent 557f532d4c
commit a45cef0566

View file

@ -7,7 +7,19 @@
(fn
([ctx pod-spec] (load-pod ctx pod-spec nil))
([ctx pod-spec _opts]
(let [env (:env ctx)
(let [ns-load-fns (atom {})
load-fn (fn load-fn [{:keys [:namespace]}]
(when-let [f (get @ns-load-fns namespace)]
(f)
;; return empty source, for sci to evaluate
""))
env (:env ctx)
prev-load-fn (:load-fn @env)
new-load-fn (fn [m]
(or (load-fn m)
(when prev-load-fn
(prev-load-fn m))))
_ (swap! env assoc :load-fn new-load-fn)
pod (binding [*out* @sci/out
*err* @sci/err]
(impl/load-pod
@ -27,16 +39,16 @@
v)
v))))}))
namespaces (:namespaces pod)]
(doseq [[ns-name vars] namespaces
:let [sci-ns (sci/create-ns ns-name)]]
(sci/binding [sci/ns sci-ns]
(doseq [[var-name var-value] vars]
(cond (ifn? var-value)
(swap! env assoc-in [:namespaces ns-name var-name]
(sci/new-var
(symbol (str ns-name) (str var-name)) var-value))
(string? var-value)
(sci/eval-string* ctx var-value)))))
(doseq [[ns-name vars] namespaces]
(swap! ns-load-fns assoc ns-name
#(sci/binding [sci/ns (sci/create-ns ns-name)]
(doseq [[var-name var-value] vars]
(cond (ifn? var-value)
(swap! env assoc-in [:namespaces ns-name var-name]
(sci/new-var
(symbol (str ns-name) (str var-name)) var-value))
(string? var-value)
(sci/eval-string* ctx var-value))))))
(sci/future (impl/processor pod))
{:pod/id (:pod-id pod)})))
{:sci.impl/op :needs-ctx}))