请在 2024 年 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于 页面了解该工作原理的更多信息。

+1
ClojureScript

我主要写这篇是为了纪念,因为我找到了一个解决方案,但如果有人知道这种行为最初为什么会出现,我会很感兴趣...

假设你有一个返回浮点的宏

;; src/hello_world/macros.clj

(ns hello-world.macros)

(defmacro get-float [n]
  (float n))

...并在 clojurescript 中调用它

;; src/hello_world/core.cljs

(ns hello-world.core
  (:require-macros [hello-world.macros :refer [get-float]]))

(js/console.log (get-float 1.5))

你会得到以下错误

clojure.lang.ExceptionInfo:编译常量失败:1.5;java.lang.Float 不是一个有效的 ClojureScript 常量。

解决方案是确保宏返回一个双精度浮点数

(defmacro get-float [n]
  (double n))

我知道javascript的浮点数是64位,与java的double匹配得很好,但是32位的java float是否应该可以安全地自动转换为js float呢?

1 个答案

+1

这是因为编译器不了解 java.lang.Float。存在一个多方法,用于根据类派发常量输出。添加 Float 应该是微不足道的,可能是因为 Clojure 通常只使用 Double 而没有添加。

https://github.com/clojure/clojurescript/blob/df1837048d01b157a04bb3dc7fedc58ee349a24a/src/main/clojure/cljs/compiler.cljc#L319

可能有必要提交一个 JIRA 问题。

...