在 Clojure/ClojureScript 中导入记录类型

Import Record Type in Clojure/ClojureScript

有什么方法可以导入在 Clojure 和 ClojureScript 中都有效的记录类型吗? 据我所知,对于 Clojure,它是 (ns x (:import y [A B])),对于 ClojureScript,它是 (ns x (:require y :refer [A B])),并且每个都对各自的另一个无效。

忽略需要记录的语法细节,有两种主要方法可以在共享大部分代码的同时为多个 Clojure 变体编写 ns 声明(或任何特定于平台的代码)。

  1. CLJX 是 Clojure 编译器之前 运行 的 Clojure 预处理器。您在 .cljx 文件中编写以 #+clj#+cljs 为前缀的平台特定代码。它可以 运行 处理几乎任何 Clojure 代码,并且会吐出多个平台特定的文件,各个 Clojure 编译器可以处理这些文件。

  2. Reader Conditionals 是 Clojure 1.7 中的一项功能,在最近发布的 ClojureScript 中可用。这在本质上与 cljx 相似,但已集成到 Clojure 编译器中。您在扩展名为 .cljc 的文件中编写带有 reader 条件的代码,例如 #?(:clj 1 :cljs 2)

现在回到你的具体问题,你可以用 Reader 条件句来实现这个:

(ns myapp.music-store
  (:require #?(:clj [myapp.cool-music]
               :cljs [myapp.cool-music :refer [Vinyl]]))
  #?(:clj
     (:import [myapp.cool_music Vinyl])))

我也写了一个更长的博客 post 关于这个:Requiring records in Clojure and ClojureScript