【问题标题】:Import Record Type in Clojure/ClojureScript在 Clojure/ClojureScript 中导入记录类型
【发布时间】:2015-06-04 00:34:28
【问题描述】:

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

【问题讨论】:

  • import in CLJS in 用于 Google Closure 类。 Clojure 的导入用于 Java 类。所以我不确定你要解决什么问题?可以具体提问吗?包含您要导入的特定文件和内容?
  • @estolua 在 Clojure 中使用 import,在 ClojureScript 中使用 require
  • 遇到同样的问题,所以回复“你想解决什么”评论:在我的例子中,cljc 文件中有 clojure/clojurescript 代码,带有一些 defrecords。其他命名空间需要“导入”clojure 的记录类型,但“需要”clojurescript 的记录类型。或者简而言之:“Clojure 的导入仅适用于 Java 类”是不准确的;导入 clojure 中定义的记录也需要它。顺便说一句,使用阅读器条件应该没什么大不了的(现在会尝试,如果它不起作用会回复),但如果没有必要的话会更好。

标签: clojure clojurescript


【解决方案1】:

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

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

  2. Reader Conditionals 是 Clojure 1.7 中的一项功能,可在最近的 ClojureScript 版本中使用。这在本质上与 cljx 相似,但被集成到 Clojure 编译器中。您可以在带有.cljc 扩展名的文件中编写带有#?(:clj 1 :cljs 2) 之类的阅读器条件的代码。

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

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多