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 (fn
([ctx pod-spec] (load-pod ctx pod-spec nil)) ([ctx pod-spec] (load-pod ctx pod-spec nil))
([ctx pod-spec _opts] ([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 pod (binding [*out* @sci/out
*err* @sci/err] *err* @sci/err]
(impl/load-pod (impl/load-pod
@ -27,16 +39,16 @@
v) v)
v))))})) v))))}))
namespaces (:namespaces pod)] namespaces (:namespaces pod)]
(doseq [[ns-name vars] namespaces (doseq [[ns-name vars] namespaces]
:let [sci-ns (sci/create-ns ns-name)]] (swap! ns-load-fns assoc ns-name
(sci/binding [sci/ns sci-ns] #(sci/binding [sci/ns (sci/create-ns ns-name)]
(doseq [[var-name var-value] vars] (doseq [[var-name var-value] vars]
(cond (ifn? var-value) (cond (ifn? var-value)
(swap! env assoc-in [:namespaces ns-name var-name] (swap! env assoc-in [:namespaces ns-name var-name]
(sci/new-var (sci/new-var
(symbol (str ns-name) (str var-name)) var-value)) (symbol (str ns-name) (str var-name)) var-value))
(string? var-value) (string? var-value)
(sci/eval-string* ctx var-value))))) (sci/eval-string* ctx var-value))))))
(sci/future (impl/processor pod)) (sci/future (impl/processor pod))
{:pod/id (:pod-id pod)}))) {:pod/id (:pod-id pod)})))
{:sci.impl/op :needs-ctx})) {:sci.impl/op :needs-ctx}))