能否使用CLJC单文件宏定义来与ClojureScript一起工作?

10

我已成功地从其他命名空间中导入宏,但我想知道在Clojure 1.7中是否应该/可以使用单文件结构定义和使用宏。我尝试过的方法不起作用,但可能我错过了某些细节。

(ns cljc.core)

#?(:cljs
(enable-console-print!))

#?(:clj
(defmacro list-macro [x y]
  `(list ~x ~y)))

(defn foo [a]
  (println (list-macro a a)))

(foo :a)

当编译cljs时,此表单会由于未定义list-macro而失败;如果我删除围绕list-macro的:clj守卫,则在cljs编译中未定义defmacro。有办法吗?


3
ClojureScript的宏仍然是Clojure。它们在编译时起作用——当ClojureScript代码被编译为JavaScript时。因此,在进行任何ClojureScript编译之前,它们需要先被编译(从Clojure到JVM)。 - muhuk
1个回答

14

是的,有一种单文件构建的方法。

(ns cljc.core
  #?(:cljs (:require-macros [cljc.core :refer [list-macro]])))

#?(:clj
(defmacro list-macro [x y]
;; ...

可以假设下一个 CLJS 编译器版本中将自动执行导入操作。


我认为作者想要写的是 defmacro,而不是 require - zarkone
1
是的。但他需要在ClojureScript中编写:require-macros才能使用宏。这就是他所问的答案。 - Leon Grapenthin
聪明的方法是在路上首先强制进行CLJ编译!希望有一天它确实可以自动工作,至少在cljc文件中。 - ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接