2024 Clojure 状况调查! 中分享您的想法。

欢迎!请参阅 关于 页,了解有关此工作方式的一些更多信息。

0
ClojureScript
以下代码在无法到达警告的条件的情况下触发了算术警告。我在 Clojure 中测试了此代码,但它没有生成警告。我猜 CLJS 编译器不记笔记的方式与 Clojure 编译器处理 (Error.) 的方式不同

下面是触发的确切警告,随后是代码。


WARNING: cljs.core/+, 所有参数必须是数字,得到了 [number clj-nil]。文件:src\spurious_arithmetic\core.cljs,行号:22



(def x [0 1 2 3 4 nil])
(def index (atom -1))
(defn take-value []
  (->> (swap! index inc)
       (nth x)))

(-> (loop [result (take-value)
           prev nil]
      (if (= nil result prev) (throw (js/Error. "This condition prevents nil arithmetic.")))
      (if (some? result)
        (recur (take-value) result)
        (+ 1 prev)))                                        ; 触发了 [number cljs-nil] 警告
    (print)) ; 5

2 答案

0

评论者:mfikes

编译器中的类型推断逻辑预期循环局部变量的类型是静态的。实际上,与 CLJS-1561 的进行方式正好相反。

0
参考:https://clojure.atlassian.net/browse/CLJS-1450(由 alex+import 汇报)
...