为什么Clojure中的(/ 1/2)等于2N?

Lyn*_*rer 2 clojure division bigint

前几天只是在Clojure repl中玩,我遇到了这个.

user=> (/ 1/2)
2N
Run Code Online (Sandbox Code Playgroud)

所以我尝试了这个:

user=> (type (/ 1/2)) 
clojure.lang.BigInt
Run Code Online (Sandbox Code Playgroud)

谁知道这里发生了什么?

Lee*_*Lee 5

1/2创建一个Ratio,/函数最终调用(clojure.lang.Numbers/divide 1 1/2).如果你看一下这个定义,它最终会调用(clojure.lang.Numbers$RatioOps/divide 1 1/2).这将提升1L为一个比率,执行比率除法,然后将结果简化2/1BigInt2.

  • 请注意,[`clojure.lang.Ratio`](http://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Ratio.java)包含`numerator`和`分母`作为Java`Biginteger`s.因此,即使可能,随后的反演也不容易被简化为"长". (2认同)