那些数学函数在Clojure中以撇号结尾是什么?

时间:2017-01-04 00:41:10

标签: clojure functional-programming lisp clojurescript

有些数学函数以撇号结尾,例如:+'*'-'

非撇号和撇号之间有什么区别?

1 个答案:

答案 0 :(得分:18)

他们是"自动推广"普通数学函数的版本。

user> (* Long/MAX_VALUE 2)
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)
user> (*' Long/MAX_VALUE 2)
18446744073709551614N

如果输出太大,它们将返回比输入更大的数据类型。 这曾经是Clojure早期的默认行为,然后如果数学运算的输出超出了它的数据类型,则会更改为抛出异常。这提高了数字性能,通常有助于发现错误。在那之后的五年左右,令人惊讶的是,很少有人抱怨这种变化打破了任何事情。决定在溢出时保留抛出异常的行为,因为这几乎总是一个错误。

实际上,大多数情况下,您将知道何时需要使用BigIntegers和BigDecimals,并且可以使用这些数据类型的常规函数​​。

user> (* Long/MAX_VALUE 2N)
18446744073709551614N

在这个例子中,我使用了普通的*函数,并向它传递了一个BigInteger类型的参数(N 2N对于clojure的意义-reader)

在某些情况下,您确实需要使用任何尺寸编号,而不事先知道它的尺寸,这些功能会派上用场。到目前为止,大多数这些示例都是StackOverflow上的因子示例。

如果您真的希望数学运算溢出,那么您可以使用明确不安全的数学函数:

user> (unchecked-add Long/MAX_VALUE 2)
-9223372036854775807
相关问题