1

我有一个用于 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但我从未在任何地方实际导出或需要此宏。我只想在定义的地方使用它。那么如何在文件中间告诉编译器使用 Clojure 来扩展这个宏,然后才能到达 ClojureScript 编译器呢?

4

1 回答 1

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" ] ...

重要的是,我在 cljsbuild 源路径中添加了“目标/类”,即 cljx 将其创建的 clj 文件放置到其中的输出路径。这是 cljsbuild 进程可以找到带有宏定义的 clj 文件的地方。

我不确定这是否是解决问题的正确或有原则的方法。但它现在似乎正在工作(除非我对某些事情感到困惑)。

于 2014-08-30T15:20:00.323 回答