首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cljx中使用Clojure宏

在cljx中使用Clojure宏
EN

Stack Overflow用户
提问于 2014-08-30 16:53:44
回答 1查看 179关注 0票数 1

我有一个用cljx编写的图形程序的代码库,它被编译成Clojure和ClojureScript。

现在我想介绍我的第一个宏。

代码语言:javascript
复制
(defmacro optional-styled-primitive [args body] 
   (let [extra (conj args 'style)] 
     `(fn (~extra (->SShape ~'style ~body))
          (~args (->SShape {} ~body)) 
      )
   )
)

此宏的用途是获取一个参数列表,以及一个使用这些参数生成几何体的表达式。并返回一个具有两个奇偶性的函数:其中一个采用可选的样式参数。然后,这个宏将在定义它的文件中使用,以生成许多其他可选的接受样式的函数。例如:

代码语言:javascript
复制
(def square (optional-styled-primitive [n] [[0 0] [0 n] [n n] [n 0]]))

但是引入这个宏显然会打破编译的ClojureScript阶段。

我不知道该怎么做。网上讨论说ClojureScript需要使用:require-macros,但实际上我从来没有在任何地方导出或需要这个宏。我只想在定义好的地方使用它。那么,在文件到达ClojureScript编译器之前,如何在文件中间告诉编译器使用Clojure来展开这个宏呢?

EN

回答 1

Stack Overflow用户

发布于 2014-08-30 23:20:00

好的。

我在这方面取得了一些进展。

这是我所做的。

1)我将宏定义重构为一个名为macros.cljx的单独文件

2)在我使用宏的文件中,我这样做了。(对clj和cljs有不同的要求)

代码语言:javascript
复制
(#+clj :require #+cljs :require-macros 
     [myapp.macros :refer [optional-styled-primitive]])

3)我更新了我的leiningen project.clj文件:

代码语言:javascript
复制
:cljsbuild {:builds [{
     :source-paths ["target/classes" "src-cljs" ] ...

重要的是,我在cljsbuild源路径中添加了"target/classes",这是cljx放置它创建的clj文件的输出路径。这是cljsbuild进程可以找到带有宏定义的clj文件的地方。

我不确定这是不是解决问题的正确或有原则的方法。但是现在看起来可以工作了(除非我被什么搞糊涂了)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25580696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档