假设我有一个X.clojurescript和一个X.clojure名称空间。X.clojurescript中的一切都是Clojure代码,X.clojure中的一切都是Clojure代码。不幸的是,我不能直接在Clojurescript中定义宏,我必须在Clojure中定义它们,然后使用
(ns X.clojurescript.abc
(:require-macros [X.clojure.def :as clj]))这很好。但是,如果宏(在X.clojure中定义)需要引用在Clojurescript名称空间(X.clojurescript)中定义的内容,该怎么办?问题在于,在解析其他名称空间时,Clojure编译器不会查看我的Clojurescript名称空间(一个单独的目录)。
我通过简单地在Clojure代码中创建一个名称空间来解决这个问题,该名称空间和所需的定义与Clojurescript中的名称空间和所需定义相同,但这看起来有点愚蠢。因此,例如,如果我的宏中需要X.clojurescript.abc.y,我将在clojure端创建一个额外的名称空间,它在我的Clojure版本的X.clojurescript.abc中定义了一个虚拟的y;有点愚蠢。
如何处理需要在Clojurescript端引用某些内容的宏?
发布于 2013-05-13 21:56:05
宏在定义时需要特定命名空间的唯一时间是宏正使用来自所述命名空间的代码来生成它将返回的符号的列表。
您可以按照repl中的示例进行操作:
(defmacro foo
[a]
`(bar/bar ~a))即使bar不是已定义的命名空间,foo的定义也会进行编译
(foo :a)调用foo现在将失败,因为您还没有定义bar名称空间或函数bar
(ns bar)
(defn bar
[x]
[x x])在bar命名空间中定义bar
(ns user)
(foo :a)=> :a :a
请注意,在foo定义时,bar不需要存在。事实上,在foo定义时,名称空间甚至不需要存在。
https://stackoverflow.com/questions/14781868
复制相似问题