У меня есть следующий код в пространстве имен clj (clojure).
(ns project.clojure.clojurescript-макросы)
(def trace-history (atom []))
; hmm, you could run out of memory on recursive functions here?
; Fortunately functions aren't actually recursive in clojure. :]
(defmacro push-args [name args]
`(swap! trace-history
(fn [stack#]
(conj stack# [~name (zipmap ~(vec (map str args)) ~args)]))))
(push-args :hello [:a :b :c])
в другом пространстве имен cljs (clojurescript) у меня есть следующие
(ns project.clojurescript.user
(:require-macros [project.clojure.clojurescript-macros :as c]))
(c/push-args :hello [:a :b :c])
Я компилирую свой код clojurescript и открываю его в своем браузере. К сожалению, я получаю следующую ошибку.
Uncaught TypeError: Cannot read property 'trace_history' of undefined main.js:22348
(anonymous function) main.js:22348
Глядя на строку 22348 в моем скомпилированном коде clojurescipt, я вижу следующее.
cljs.core.swap_BANG_.call(null, project.clojure.trace_history, function(stack__6402__auto__) {
return cljs.core.conj.call(null, stack__6402__auto__,
cljs.core.PersistentVector.fromArray(["\ufdd0'hello",
cljs.core.zipmap.call(null,
cljs.core.PersistentVector.fromArray([":a", ":b", ":c"], true),
cljs.core.PersistentVector.fromArray(["\ufdd0'a", "\ufdd0'b", "\ufdd0'c"],
true))],
true))
});
Проблема в том, что project.clojure.trace_history нигде не определено в main.js. Я понимаю, что не так, но не знаю, как это исправить. Я пробовал другие решения, такие как размещение истории трассировки в общем файле clojure и запись истории трассировки в сам файл cljs. Кажется, ничего не работает. Учитывая, что я хочу иметь общий глобальный атом между всеми компиляциями этого макроса, как я могу сделать это в Clojurescript?