是什么让Lisp具有出色的数学表现?

时间:2013-10-30 09:41:21

标签: lisp common-lisp integer-arithmetic

我在Lisp教科书中读到这篇文章:

  

Lisp可以用数字执行一些惊人的壮举,特别是与大多数其他语言相比时。例如,这里我们使用函数expt来计算53的五十三次幂:

CL> (expt 53 53) 
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373
  

大多数语言会在涉及如此大数目的计算中窒息。

是的,这很酷,但作者没有解释为什么Lisp可以比其他语言更容易,更快地完成这项任务。

当然有一个简单的原因,任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:12)

这是"worse is not always better"

的一个很好的例子

新泽西方法

“传统”语言,如C / C ++ / Java,基于硬件功能限制范围整数算术,例如int32_t - 带符号的32位数字,当结果不适合时,它会无声地溢出32位。这非常快,并且通常看起来很好用于实际目的,但是导致很难发现错误。

麻省理工学院/斯坦福大学的风格

Lisp采取了不同的方法。

它有一个“小”的未装箱整数类型fixnum,当fixnum算术的结果不适合fixnum时,它会自动且透明地提升为任意大小{{3} },所以你总是得到数学上正确的结果。这意味着,除非编译器证明结果是fixnum,否则它必须添加代码以检查是否必须分配bignum。实际上,这应该在现代建筑上花费0,但在4年前制作时这是一个非平凡的决定。

“传统”语言,当他们提供bignum算术时,以“图书馆”的方式做到这一点,即

  • 必须由用户明确请求;
  • bignums以笨拙的方式操作:BigInteger.add(a,b)而不是a+b;
  • 即使实际数量很小并且适合机器int,也会产生成本。

请注意,Lisp方法与bignum的Lisp传统完全一致,可能会增加一些额外的复杂性。它也体现在自动化内存管理中,现在已成为主流,但在过去遭到了恶意攻击。整数算术的lisp方法现在已经在其他一些语言中使用(例如,python),因此进展正在发生!

答案 1 :(得分:2)

要添加到wvxvw所写的内容,它在Lisp中更容易,因为bignums内置于该语言中。你可以像C或Java中那样使用大量数字进行处理。