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