由:csm
我认为这里是 clojure.lang.Numbers 中不同除法版本的语义不同。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) 的调用,但这只是将第一个参数装箱并调用另一个版本)。
基于编译时推断的类型进行不同的除法语义似乎是错误的;但是,我不知道这是否影响除以零之外的其他除法实例,所以这可能不是真正的问题。