评论由:csm 提出
我认为这里的问题是 clojure.lang.Numbers 中不同版本的 divide 有不同的语义。Numbers.divide(Object, Object) 执行 isZero 检查,但 Numbers.divide(long, double) 不执行(它只是使用 Java 的除法运算符,因为除数是一个值为 0.0 的双精度浮点数,所以结果是无穷大)。
类似 (/ 1 0.0) 的语句会被编译成调用 Numbers.divide(long, double),因此结果是无穷大。如果第二个参数是函数调用或 var,它看起来像 Object,所以它会被编译成使用 Numbers.divide(Object, Object),并且当第二个参数为零时抛出异常(实际上它编译成调用 Numbers.divide(long, Object),但这只是将第一个参数装箱并调用另一种变体)。
似乎在编译时根据推断的类型对除法具有不同的语义是不正确的;然而,我不知道这是否会影响除零之外的任何其他除法实例,因此这可能是微不足道的问题。