有没有办法导入一个在Clojure和ClojureScript中有效的记录类型?
据我所知,Clojure的(ns x (:import y [A B]))
,ClojureScript的(ns x (:require y :refer [A B]))
,并且每个对于其他人都无效。
答案 0 :(得分:2)
忽略需要记录语法的细节,在共享大部分代码时,有两种主要方法可以为多个Clojure变体编写ns声明(或任何特定于平台的代码)。
CLJX是一个在Clojure编译器之前运行的Clojure预处理器。您在#+clj
文件中编写了以#+cljs
或.cljx
为前缀的特定于平台的代码。它几乎可以在任何Clojure代码上运行,并且会吐出多个特定于Clojure编译器的平台特定文件。
Reader Conditionals是Clojure 1.7中的一个功能,可在最新版本的ClojureScript中找到。这在精神上与cljx类似,但是被集成到Clojure编译器中。您在具有#?(:clj 1 :cljs 2)
扩展名的文件中使用.cljc
等读者条件编写代码。
现在回到您的具体问题,您可以使用Reader Conditionals实现此目的:
(ns myapp.music-store
(:require #?(:clj [myapp.cool-music]
:cljs [myapp.cool-music :refer [Vinyl]]))
#?(:clj
(:import [myapp.cool_music Vinyl])))
我写了一篇关于此的更长篇博文:Requiring records in Clojure and ClojureScript