我主要写这篇是为了纪念,因为我找到了一个解决方案,但如果有人知道这种行为最初为什么会出现,我会很感兴趣...
假设你有一个返回浮点的宏
;; 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呢?