在 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 声明(或任何特定于平台的代码)。
CLJX 是 Clojure 编译器之前 运行 的 Clojure 预处理器。您在 .cljx
文件中编写以 #+clj
或 #+cljs
为前缀的平台特定代码。它可以 运行 处理几乎任何 Clojure 代码,并且会吐出多个平台特定的文件,各个 Clojure 编译器可以处理这些文件。
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
有什么方法可以导入在 Clojure 和 ClojureScript 中都有效的记录类型吗?
据我所知,对于 Clojure,它是 (ns x (:import y [A B]))
,对于 ClojureScript,它是 (ns x (:require y :refer [A B]))
,并且每个都对各自的另一个无效。
忽略需要记录的语法细节,有两种主要方法可以在共享大部分代码的同时为多个 Clojure 变体编写 ns 声明(或任何特定于平台的代码)。
CLJX 是 Clojure 编译器之前 运行 的 Clojure 预处理器。您在
.cljx
文件中编写以#+clj
或#+cljs
为前缀的平台特定代码。它可以 运行 处理几乎任何 Clojure 代码,并且会吐出多个平台特定的文件,各个 Clojure 编译器可以处理这些文件。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