在Clojure / ClojureScript中导入记录类型

时间:2015-06-04 00:34:29

标签: clojure clojurescript

有没有办法导入一个在Clojure和ClojureScript中有效的记录类型? 据我所知,Clojure的(ns x (:import y [A B])),ClojureScript的(ns x (:require y :refer [A B])),并且每个对于其他人都无效。

1 个答案:

答案 0 :(得分:2)

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

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

  2. Reader Conditionals是Clojure 1.7中的一个功能,可在最新版本的ClojureScript中找到。这在精神上与cljx类似,但是被集成到Clojure编译器中。您在具有#?(:clj 1 :cljs 2)扩展名的文件中使用.cljc等读者条件编写代码。

  3. 现在回到您的具体问题,您可以使用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