Ste*_*gle 11 macros clojure clojurescript
我们假设我有一个X.clojurescript和一个X.clojure命名空间.X.clojurescript中的所有内容都是Clojurescript代码,X.clojure中的所有内容都是Clojure代码.不幸的是,我不能直接在Clojurescript中定义宏,我必须在Clojure中定义它们,然后使用它们将它们带入Clojurescript命名空间
(ns X.clojurescript.abc
(:require-macros [X.clojure.def :as clj]))
Run Code Online (Sandbox Code Playgroud)
这可以.但是,如果宏(在X.clojure中定义)需要引用Clojurescript命名空间(X.clojurescript)中定义的内容,该怎么办?问题是Clojure编译器在解析其他命名空间时不会查看我的Clojurescript命名空间(单独的目录).
我通过简单地在我的Clojure代码中创建一个命名空间来解决这个问题,该命名空间具有与Clojurescript中相同的命名空间和所需的定义,但这看起来有点愚蠢.所以,举例来说,如果我需要X.clojurescript.abc.y在我的宏,我只是将创建Clojure的一侧DEFS一个伪Y在X.clojurescript.abc我Clojure的版本额外的命名空间; 有点愚蠢.
我如何处理需要在Clojurescript方面引用某些内容的宏?
宏在定义时唯一需要特定命名空间的情况是宏是否使用来自所述命名空间的代码来生成它将返回的符号列表.
你可以在repl中跟随这些例子:
(defmacro foo
[a]
`(bar/bar ~a))
Run Code Online (Sandbox Code Playgroud)
即使bar不是已定义的命名空间,foo的定义也会编译
(foo :a)
Run Code Online (Sandbox Code Playgroud)
调用foo现在会失败,因为你还没有定义bar命名空间或函数栏
(ns bar)
(defn bar
[x]
[x x])
Run Code Online (Sandbox Code Playgroud)
在bar命名空间中定义bar
(ns user)
(foo :a)
Run Code Online (Sandbox Code Playgroud)
=> [:a:a]
请注意,在foo定义时,bar不需要存在.实际上,在foo定义时,名称空间甚至不需要存在.