在宏中动态创建Clojurescript命名空间?
我可以编写Clojurescript宏来定义另一个命名空间中的函数吗 在使用宏的命名空间中定义函数非常简单: mac.clj中定义的宏在宏中动态创建Clojurescript命名空间?,clojurescript,Clojurescript,我可以编写Clojurescript宏来定义另一个命名空间中的函数吗 在使用宏的命名空间中定义函数非常简单: mac.clj中定义的宏 (ns nut.mac) (defmacro def-foo "Define a trivial function in the *current* namespace named ``fn-name''." [fn-name] `(defn ~(symbol fn-name) [] ~(str "It's " fn-name "."))) ;;
(ns nut.mac)
(defmacro def-foo
"Define a trivial function in the *current* namespace named ``fn-name''."
[fn-name]
`(defn ~(symbol fn-name) [] ~(str "It's " fn-name ".")))
;; (macroexpand '(def-foo "bar"))
;; => (def bar (clojure.core/fn ([] "It's bar.")))
在foo.cljs中调用的宏
(ns nut.foo
(:require-macros [nut.mac :refer [def-foo def-ns-foo]]))
(def-foo "a-function") ;; creates nut.foo.a-function
我希望宏在不同的命名空间中创建一个函数。
像这样的东西(行不通):
然后调用nut.foo命名空间中的宏:
(ns nut.foo
(:require-macros [nut.mac :refer [def-ns-foo]]))
(def-ns-foo "nut.x" "baz")
;; WARNING: Use of undeclared Var cljs.core/ns at line 8
很明显,文件顶层的ns表单在编译时会被特别处理
类似的东西可以工作(都在一个文件中),但有点乏味:
(ns nut.foo
(:require-macros [nut.mac :refer [def-foo]]))
(ns nut.x)
(def-foo "baz")
(ns nut.y)
(def-foo "baz")
(ns nut.z)
(def-foo "baz")
我已经开始研究cljs.analyzer.api,但老实说,理解这一点可能比现在的情况更麻烦
在Clojurescript宏中创建名称空间是不可能的,还是仅仅是错误的
(ns nut.foo
(:require-macros [nut.mac :refer [def-foo]]))
(ns nut.x)
(def-foo "baz")
(ns nut.y)
(def-foo "baz")
(ns nut.z)
(def-foo "baz")