为什么Emacs中的fixnums只有29位?

时间:2008-09-20 00:44:12

标签: emacs lisp elisp

他们为什么不改变它?

编辑: 问的原因是因为我是emacs的新手,我想将Emacs用作“程序员计算器”。所以,我可以操纵32位& 64位整数,并使它们像在本机上一样。

7 个答案:

答案 0 :(得分:18)

Emacs-Lisp是一种动态类型语言。这意味着您需要在运行时使用类型标记。如果你想使用数字,你通常必须将它们打包成某种你可以指向的标记容器(即“盒子”它们),因为在运行时无法区分指针与机器整数没有某种标记方案。

出于效率原因,大多数Lisp实现因此不使用原始指针,但我认为称为描述符。这些描述符通常是单个机器字,可以表示指针,未装箱的数字(所谓的 fixnum ),或者是各种其他硬编码数据结构之一(它通常值得编码NIL和缺点)特别是细胞,例如)。

现在,显然,如果你添加了类型标签,你没有剩余的全部32位数,所以你在MIT方案中留下26位,或者在Emacs中留下29位或任何其他数字您没有用完标记的位数。

各种动态语言的某些实现为fixnums保留了多个标记,以便它们可以为您提供30位甚至31位的fixnums。 SBCL是Common does this的一个实现。我不认为这导致的并发症对Emacs来说是值得的。在文本编辑器中,你甚至需要快速的30位fixnum算法,而不需要将其Lisp代码编译成机器代码(或者不是吗?记得,实际上)?你在Emacs-Lisp中编写distributed.net客户端吗?那么最好切换到Common Lisp! ;)

答案 1 :(得分:7)

其余3位用作Lisp解释器的标志。 (您可以通过为64位计算机编译Emacs来获得更大的整数。)

答案 2 :(得分:5)

其他人评论为什么fixnums只有29位宽。但如果您想要程序员的计算器,请查看calc。它提供任意精度整数,矩阵运算,单位转换,图形通过gnuplot,统计函数,财务函数,科学函数,RPN和代数表示法,公式简化......它已经是Emacs的一部分,所以要开始,请访问“calc”的信息节点,从教程开始。

答案 3 :(得分:3)

其他三位用作对象类型的标记。这曾经是如此普遍,以至于许多CPU架构至少包含对其指令集中标记整数的一些支持: SparcAlphaBurroughs和 例如K-Machine。现在我们让Lisp运行时处理标签,而无需额外的硬件支持。如果您想快速了解历史,我建议您阅读关于Sparc的第一个链接。

答案 4 :(得分:1)

在许多Lisp实现中,单词中的一些位用于标记。这让垃圾回收器之类的东西知道什么是指针,什么不是不必猜测。

为什么你关心Elisp fixnum有多大?您可以按原样打开巨大的文件。

答案 5 :(得分:1)

我使用Common Lisp解释器CLISP作为程序员的计算器。 Common Lisp具有我在任何编程语言中看到的最安全的数字处理;最值得注意的是,它具有任意大小的整数,即bignums,以及有理数。它还具有任意数字基数的输入和bignums的按位函数。如果要在Emacs中进行计算,可以在M-x shell中运行CLISP。作为奖励,语法几乎与您在Emacs Lisp中使用的语法完全相同。

答案 6 :(得分:0)

仅适用于32位体系结构,可以根据构建选项进行更改。其他位用于标记基本数据结构。

您可以使用具有更大整数的64位构建,并且存在用于任意大整数运算的包。

或者,你只是在问一个夸夸其谈的问题,试图听起来很生气和重要......