diff --git a/src/babashka/pods/sci.clj b/src/babashka/pods/sci.clj index 5defed5..2b65f34 100644 --- a/src/babashka/pods/sci.clj +++ b/src/babashka/pods/sci.clj @@ -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}))