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