Как реализовать * load-fn * для: требуется в загрузочном скрипте - PullRequest
0 голосов
/ 15 октября 2019
(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 моей пользовательской функции загрузки?

Есть ли лучший/ более эффективный способ сделать это?

1 Ответ

0 голосов
/ 15 октября 2019

Полагаю, я нашел ответ:

Опция: load в eval-str может быть установлена ​​на следующую функцию:

(defn load-dep [opts cb]
  (cb {:lang :js :source ""})

И она довольно успешно разрешится. Это не совсем очевидно из документации, что обратный вызов может вернуть это значение, когда пространство имен / var уже находится в состоянии компилятора, поэтому я оставлю вопрос здесь.

...