为什么范围如此具体?为什么不是29位宽或32位宽,为什么是30位宽?理由是什么?标准(1)似乎没有给予它
bq3bfh9z1#
我最终在Haskell Discourse forum上询问了这个谜团,在那里有多种理论,直到一位用户能够确认这确实是因为耶鲁 haskell (正如这篇评论已经推测的那样)。Yale Haskell将Haskell程序编译为Common Lisp程序。(具体来说,Yale Haskell旨在运行在Lucid Common Lisp,CMU Common Lisp(CMUCL)或Armed Bear Common Lisp(AKCL)上。Lisp是一种完全动态类型的编程语言(与Haskell不同),需要在运行时保留所有类型信息。CMUCL采用的方法是在所有运行时值上使用三个较低的位作为此类型信息的标记[1,2]。为“偶数”和“奇数”小整数(fixnum s)保留了两种位模式,以给予30位范围。因此,如果Haskell程序被编译为Common Lisp程序,并且意图是将Lisp fixnum重新用于Haskell的Int s,则它们的有效范围将仅为30位,换句话说,[-2^29..2^29-1]范围。在当今时代,这一切都不再重要了,原因如下:
fixnum
Int
[-2^29..2^29-1]
1条答案
按热度按时间bq3bfh9z1#
我最终在Haskell Discourse forum上询问了这个谜团,在那里有多种理论,直到一位用户能够确认这确实是因为耶鲁 haskell (正如这篇评论已经推测的那样)。
Yale Haskell将Haskell程序编译为Common Lisp程序。(具体来说,Yale Haskell旨在运行在Lucid Common Lisp,CMU Common Lisp(CMUCL)或Armed Bear Common Lisp(AKCL)上。Lisp是一种完全动态类型的编程语言(与Haskell不同),需要在运行时保留所有类型信息。
CMUCL采用的方法是在所有运行时值上使用三个较低的位作为此类型信息的标记[1,2]。为“偶数”和“奇数”小整数(
fixnum
s)保留了两种位模式,以给予30位范围。因此,如果Haskell程序被编译为Common Lisp程序,并且意图是将Lisp
fixnum
重新用于Haskell的Int
s,则它们的有效范围将仅为30位,换句话说,[-2^29..2^29-1]
范围。在当今时代,这一切都不再重要了,原因如下:
Int
的完整32位/64位范围。fixnum
使用了不同的内部表示。