我有一个cljx图形程序的代码库,可以编译成Clojure和ClojureScript。
我现在要介绍我的第一个宏。
(defmacro optional-styled-primitive [args body]
(let [extra (conj args 'style)]
`(fn (~extra (->SShape ~'style ~body))
(~args (->SShape {} ~body))
)
)
)
此宏的目的是获取参数列表,以及使用这些参数生成几何的表达式。并返回一个具有两个arities的函数:其中一个采用可选的样式参数。然后,该宏将在其定义的文件中使用,以生成可选择采用样式的许多其他函数。例如:
(def square (optional-styled-primitive [n] [[0 0] [0 n] [n n] [n 0]]))
但是,引入这个宏显然打破了编译的ClojureScript阶段。
我无法弄清楚该怎么做。在线讨论谈论ClojureScript需要使用:require-macros
,但我实际上从未实际导出或需要此宏。我只想在它定义的地方使用它。那么,在文件中间,我怎么能告诉编译器在它到达ClojureScript编译器之前使用Clojure扩展这个宏呢?
答案 0 :(得分:0)
行。
我已经取得了一些进展。
这就是我的所作所为。
1)我将我的宏定义重构为一个名为macros.cljx
2)在我使用宏的文件中,我做了这个。 (对clj和cljs的不同要求)
(#+clj :require #+cljs :require-macros
[myapp.macros :refer [optional-styled-primitive]])
3)我更新了我的leiningen project.clj文件:
:cljsbuild {:builds [{
:source-paths ["target/classes" "src-cljs" ] ...
这里重要的是我添加了" target / classes",这是cljx将它创建的clj文件放到cljsbuild源路径的输出路径。这是cljsbuild进程可以找到带有宏定义的clj文件的地方。
我不确定这是解决问题的正确方法还是原则性方法。但是现在似乎正在工作(除非我被某些东西弄糊涂了)。