我在 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
查看我编译的 clojurescipt 代码中的第 22348 行,我看到以下内容。
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 中这样做?