8

他们为什么不改变呢?

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

4

7 回答 7

18

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!;)

于 2008-09-20T08:40:08.200 回答
7

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

于 2008-09-20T01:09:10.373 回答
5

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

于 2008-10-21T13:15:46.203 回答
3

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

于 2008-09-20T05:07:58.117 回答
1

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

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

于 2008-09-20T03:30:32.937 回答
1

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

于 2008-12-11T10:17:45.430 回答
0

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

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

或者,你只是在问一个反问,试图听起来很生气和重要......

于 2008-09-20T01:09:13.307 回答