【问题标题】:Platform-independent math functions in Clojure(script)Clojure 中与平台无关的数学函数(脚本)
【发布时间】:2014-01-16 11:23:22
【问题描述】:

如何以纯 Clojure 方式访问 sincosPI 之类的内容?

例如,如果我想写一个纯库,我不能使用 (.PI Math) (Java) 或 (.‑PI js/Math) (JS) 之类的东西。

【问题讨论】:

  • “纯 Clojure 方式”是在适当的时候使用与宿主语言的互操作,如本例所示。您是在问 (a) 是否存在与宿主语言无关的数学库,或者 (b) 如何为 Clojure 和 ClojureScript 编写代码?如果是后者,请查看github.com/lynaghk/cljx

标签: clojure clojurescript


【解决方案1】:

最简单的方法是使用Cljx:https://github.com/lynaghk/cljx

有了它,你可以写出类似的东西:

(* 5 #+clj (.PI Math) #+cljs (.‑PI js/Math))

并将此代码正确编译为 Clojure 和 ClojureScript。

据我所知,没有更好的方法可以编写一个代码以作为 Clojure/ClojureScript 运行。

有一些计划在 Clojure 本身中包含平台检测,但我认为它还没有准备好。

【讨论】:

  • 我有一些奇怪的字符在这里复制和粘贴 Math/PI 的 js 互操作,可能值得自己输入。很好的答案,谢谢。
【解决方案2】:

Cljx

Cljx 已被弃用数年。请参阅transition guide,这也是对新解决方案的一个很好的概述:

.cljc

针对多个 Clojure 平台的代码使用 reader conditionals 编写在 .cljc 文件中(在 Clojure 中引入 1.7)。

优秀的kixi.stats 使用 cljc 实现了与平台无关的 Clojure 数学运算,不仅为我们提供了一个有用的库,而且是该方法的一个很好的示例。摘录:

(def PI
  #?(:clj Math/PI
     :cljs js/Math.PI))

(defn sin [x]
  #?(:clj  (Math/sin x)
     :cljs (js/Math.sin x)))

(def infinity
  #?(:clj Double/POSITIVE_INFINITY
     :cljs js/Infinity))

此代码来自kixi.stats.math

【讨论】:

    【解决方案3】:

    罪例:

    (.sin js/Math 3) 
    

    PI 示例:

    (aget js/Math "PI")
    

    在控制台中显示:

    (.log js/console (aget js/Math "PI"))
    

    希望对您有所帮助。

    【讨论】:

    • 该平台如何独立?
    • 嗨,请阅读标题(即,它声明“Clojurescript”:)“平台无关”一词不是确定的。一般来说,javascript 被认为是“平台无关的”(例如,大多数现代操作系统的支持标准 jsvascript)。 javascript 数学库是标准的。因此,我需要问一下您担心哪些平台不支持 javascript?更重要的是,你为什么在不包含标准 javascript 的平台上使用 Clojurescript?
    • 你读过这个问题吗?在这种情况下,平台当然是 Clojure 的实现。您刚刚展示了如何在 Javascript 平台上执行此操作(顺便说一句,我已经在问题中这样做了)。
    • 您好,请编辑问题,以便包含您对“平台”的定义。请编辑标题:)人们只能回答您提出的问题:)您的问题越具体,歧义越少,答案就越好:)祝您好运:)
    • 恕我直言,这个问题很清楚。 yonki 似乎也这么认为,因为他的回答与正确的事情有关。
    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多