(ns scratch
(:require [cljs.js :as cjs]))
;Let's setup a simple clojurescript string eval that supports namespaces:
(def current-ns 'cljs.user)
(def compiler-state (cjs/empty-state))
(defn eval-text [text]
(println string)
(cjs/eval-str compiler-state text current-ns
{:eval cjs/js-eval
:ns current-ns
:context :expr
:def-emits-var true}
(fn [result]
(set! current-ns (:ns result))
(println result))))
(eval-text "(ns a.a)")
(eval-text "(defn add [a b] (+ a b))")
(eval-text "(add 4 4)")
;I can refer to the function from another namespace explicitly with no problem
(eval-text "(ns x.x)")
(eval-text "(a.a/add 6 6)")
;However when I do
(eval-text "(ns b.b (:require [a.a :refer [add]]))")
В последней строке я получаю:
{:error #error {:message Could not require a.a, :data {:tag :cljs/analysis-error}, :cause #object[Error Error: No *load-fn* set]}}
Так что мне нужно создать свой собственный https://cljs.github.io/api/cljs.js/#STARload-fnSTAR и передать его в опцию: load compiler для обработки этого: требуют дажехотя состояние компилятора уже знает о моем пространстве имен, так как я могу вызвать полностью определенную функцию из другого пространства имен. Правильно?
Каков наилучший способ сделать это?
Должен ли я создавать карты, которыесохранить пространство имен-> исходный код из ранее проверенного кода и получить пространство имен-> анализ-кэш из состояния компилятора и передать их в обратные вызовы: source и: cache моей пользовательской функции загрузки?
Есть ли лучший/ более эффективный способ сделать это?