【问题标题】:can cljc single-file macro definitions to work with clojurescript?cljc 单文件宏定义可以与 clojurescript 一起使用吗?
【发布时间】:2015-07-07 00:59:00
【问题描述】:

我有 clojurescript 从其他命名空间成功导入宏。但是我想知道 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 未定义;如果我删除列表宏周围的 :clj 保护,则在 cljs 编译中未定义 defmacro。有什么办法吗?

【问题讨论】:

  • 没有。 ClojureScript 宏仍然是 Clojure。他们在编译时做他们的工作——当 ClojureScript 代码被编译成 JavaScript 时。因此,在进行任何 ClojureScript 编译之前,需要先编译它们(从 Clojure 到 JVM)。

标签: clojure macros conditional clojurescript reader


【解决方案1】:

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

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

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

假设下一个 CLJS 编译器版本将自动执行导入。

【讨论】:

  • 我觉得作者想写defmacro,不需要
  • 是的。但是他需要写:require-macros 才能在 ClojureScript 中使用宏。这就是他所要求的答案。
  • 聪明的方式来强制CLJ编译沿途!希望有一天它确实会自动工作,至少在 cljc 文件中时是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多