Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在宏中动态创建Clojurescript命名空间?_Clojurescript - Fatal编程技术网

在宏中动态创建Clojurescript命名空间?

在宏中动态创建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 "."))) ;;

我可以编写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 ".")))

;; (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")