将Clojure宏与cljx一起使用

时间:2014-08-30 08:53:44

标签: macros clojure clojurescript cljx

我有一个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扩展这个宏呢?

1 个答案:

答案 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文件的地方。

我不确定这是解决问题的正确方法还是原则性方法。但是现在似乎正在工作(除非我被某些东西弄糊涂了)。