我有一个用cljx编写的图形程序的代码库,它被编译成Clojure和ClojureScript。
现在我想介绍我的第一个宏。
(defmacro optional-styled-primitive [args body]
(let [extra (conj args 'style)]
`(fn (~extra (->SShape ~'style ~body))
(~args (->SShape {} ~body))
)
)
)此宏的用途是获取一个参数列表,以及一个使用这些参数生成几何体的表达式。并返回一个具有两个奇偶性的函数:其中一个采用可选的样式参数。然后,这个宏将在定义它的文件中使用,以生成许多其他可选的接受样式的函数。例如:
(def square (optional-styled-primitive [n] [[0 0] [0 n] [n n] [n 0]]))但是引入这个宏显然会打破编译的ClojureScript阶段。
我不知道该怎么做。网上讨论说ClojureScript需要使用:require-macros,但实际上我从来没有在任何地方导出或需要这个宏。我只想在定义好的地方使用它。那么,在文件到达ClojureScript编译器之前,如何在文件中间告诉编译器使用Clojure来展开这个宏呢?
发布于 2014-08-30 23:20:00
好的。
我在这方面取得了一些进展。
这是我所做的。
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" ] ...重要的是,我在cljsbuild源路径中添加了"target/classes",这是cljx放置它创建的clj文件的输出路径。这是cljsbuild进程可以找到带有宏定义的clj文件的地方。
我不确定这是不是解决问题的正确或有原则的方法。但是现在看起来可以工作了(除非我被什么搞糊涂了)。
https://stackoverflow.com/questions/25580696
复制相似问题