2024年Clojure状态调查!中分享你的想法。

欢迎!请查看关于页面以获取更多有关此功能的信息。

+1
ClojureScript

我主要写这个是为了后人 wb ,因为我发现了一个解决方案,但如果有人知道为什么第一次会发生这种行为,我会很好奇...

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

;; 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常量。

解决方法是确保宏返回一个double

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

我知道JavaScript的浮点数是64位,与Java的double匹配得很好,但32位的Java浮点数是否应该能够安全地自动转换为js浮点数?

1 个答案

+1

这是因为编译器不了解java.lang.Float。有一个根据类类型分发的多方法来发出常量。添加Float是微不足道的,可能是因为Clojure通常只使用Double

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

可能需要打开一个JIRA问题。

...