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

Ert*_*tin 12 lisp functional-programming clojure clojurescript

有迹象表明,与像省略号结尾一些数学函数:+',*',和-'.

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

Art*_*ldt 18

它们是普通数学函数的"自动升级"版本.

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

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

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

user> (* Long/MAX_VALUE 2N)
18446744073709551614N
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我使用的正常*功能,并通过它那类型的参数BigInteger的(这是什么N2N手段,Clojure的阅读器)

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

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

user> (unchecked-add Long/MAX_VALUE 2)
-9223372036854775807
Run Code Online (Sandbox Code Playgroud)

  • 示例答案.准确而且非常彻底. (3认同)
  • 完成:还有`*unchecked-math*'可以设置为`true` (2认同)