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