他们为什么不改变呢?
编辑:问的原因是因为我是 emacs 的新手,我想将 Emacs 用作“程序员计算器”。因此,我可以操作 32 位和 64 位整数,并让它们像在本机机器上一样运行。
Emacs-Lisp 是一种动态类型语言。这意味着您在运行时需要类型标签。如果您想使用数字,通常必须将它们打包到某种可以指向的标记容器中(即“装箱”它们),因为在运行时无法区分指针和机器整数没有某种标记方案。
出于效率原因,大多数 Lisp 实现因此不使用原始指针,而是我认为称为描述符的东西。这些描述符通常是单个机器字,可以表示指针、未装箱的数字(所谓的fixnum)或各种其他硬编码数据结构之一(通常也值得特别编码 NIL 和 cons 单元,例如)。
现在,显然,如果您添加类型标签,您将没有完整的 32 位作为数字,所以您只剩下 MIT 方案中的 26 位或 Emacs 中的 29 位或任何其他位数你没有用完标记。
各种动态语言的一些实现为 fixnums 保留了多个标签,以便它们可以为您提供 30 位甚至 31 位的 fixnums。SBCL 是执行此操作的 Common Lisp 的一种实现。不过,我不认为这导致的复杂性对于 Emacs 来说是值得的。在文本编辑器中,您多久需要一次快速的 30 位 fixnum 算术而不是 29 位 fixnum 算术,它甚至不会将其 Lisp 代码编译成机器代码(或者是吗?我不记得了,实际上)?你在用 Emacs-Lisp 写一个分布式的.net 客户端吗?那么,最好切换到 Common Lisp!;)
剩下的 3 位被 Lisp 解释器用作标志。(您可以通过为 64 位机器编译 Emacs 来获得更大的整数。)
其他人评论了为什么 fixnums 只有 29 位宽。但是,如果您想要程序员的计算器,请查看calc。它提供了任意精度的整数、矩阵运算、单位转换、通过 gnuplot 绘制的图形、统计函数、金融函数、科学函数、RPN 和代数符号、公式简化......而且它已经是 Emacs 的一部分,所以要开始使用,请访问“计算”的信息节点并从教程开始。
在许多 Lisp 实现中,单词中的某些位用于标记。这让垃圾收集器之类的东西无需猜测即可知道什么是指针,什么不是指针。
为什么你在乎 Elisp 的 fixnum 有多大?您可以按原样打开巨大的文件。
我使用 Common Lisp 解释器 CLISP 作为程序员的计算器。Common Lisp 具有我在任何编程语言中见过的最合理的数字处理。最值得注意的是,它具有任意大小的整数,即 bignums,以及有理数。它还具有任意数字基数的输入和 bignums 的按位函数。如果你想在 Emacs 中计算,你可以在 Mx shell 中运行 CLISP。作为奖励,语法几乎与您在 Emacs Lisp 中使用的完全相同。
这仅适用于 32 位架构,并且可以根据构建选项进行更改。其他位用于标记基本数据结构。
您可以使用具有更大整数的 64 位构建,并且有用于任意大整数运算的包。
或者,你只是在问一个反问,试图听起来很生气和重要......