我在Lisp教科书中读到这篇文章:
Lisp可以用数字执行一些惊人的壮举,特别是与大多数其他语言相比时。例如,这里我们使用函数
expt
来计算53的五十三次幂:
CL> (expt 53 53)
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373
大多数语言会在涉及如此大数目的计算中窒息。
是的,这很酷,但作者没有解释为什么Lisp可以比其他语言更容易,更快地完成这项任务。
当然有一个简单的原因,任何人都可以解释一下吗?
答案 0 :(得分:12)
这是"worse is not always better"。
的一个很好的例子“传统”语言,如C / C ++ / Java,基于硬件功能限制范围整数算术,例如int32_t
- 带符号的32位数字,当结果不适合时,它会无声地溢出32位。这非常快,并且通常看起来很好用于实际目的,但是导致很难发现错误。
Lisp采取了不同的方法。
它有一个“小”的未装箱整数类型fixnum
,当fixnum算术的结果不适合fixnum
时,它会自动且透明地提升为任意大小{{3} },所以你总是得到数学上正确的结果。这意味着,除非编译器证明结果是fixnum
,否则它必须添加代码以检查是否必须分配bignum
。实际上,这应该在现代建筑上花费0,但在4年前制作时这是一个非平凡的决定。
“传统”语言,当他们提供bignum算术时,以“图书馆”的方式做到这一点,即
BigInteger.add(a,b)
而不是a+b
; 请注意,Lisp方法与bignum
的Lisp传统完全一致,可能会增加一些额外的复杂性。它也体现在自动化内存管理中,现在已成为主流,但在过去遭到了恶意攻击。整数算术的lisp方法现在已经在其他一些语言中使用(例如,python),因此进展正在发生!
答案 1 :(得分:2)
要添加到wvxvw所写的内容,它在Lisp中更容易,因为bignums内置于该语言中。你可以像C或Java中那样使用大量数字进行处理。