2008-09-20 15 views
8

他們爲什麼不改變它?爲什麼Emacs中的fixnums只有29位?

編輯: 問題的原因是因爲我是emacs的新手,我想使用Emacs作爲「程序員計算器」。所以,我可以操縱64位整數的32位整數,讓它們像在本地機器上一樣運行。

+0

所以fixnums並不是你想要的。你真的想要自定義整數操作來模擬機器算術。我可以詳細說明,但如果你爲此打開了一個新問題,那麼訪問該網站的其他人可能會有所幫助。 – 2008-09-22 07:47:59

回答

17

Emacs-Lisp是一種動態類型的語言。這意味着你需要在運行時輸入類型標籤。如果你想使用數字,你通常必須將它們打包成某種你可以指向的標籤容器(即將它們「打」),因爲在運行時無法區分指針和機器整數沒有某種標記方案。

出於效率原因,大多數Lisp實現因此不使用原始指針,但我認爲稱爲描述符。這些描述符通常是單個機器字,可以表示一個指針,一個未裝箱的數字(所謂的修訂號),或者其他各種硬編碼數據結構之一(通常值得特別編碼NIL和cons單元,例如)。

現在,很明顯,如果添加類型標記,則沒有完整的32位剩下的數字,所以你留下26位,如在MIT方案或29位,如在Emacs或任何其他您沒有用於標記的位數。

各種動態語言的某些實現會爲fixnums保留多個標記,以便它們可以爲您提供30位甚至31位的fixnums。 SBCL是Common Lisp的一個實現,即does this。不過,我認爲這並不會導致Emacs的價值。在文本編輯器中,你需要多久使用30位的fixnum算術,而不是29位的fixnum算法,它甚至不會將它的Lisp代碼編譯成機器代碼(或者實際上我不記得) ?你在Emacs-Lisp中編寫分佈式客戶機嗎?更好地切換到Common Lisp,然後!;)

7

其餘3位用作Lisp解釋器的標誌。 (通過爲64位機器編譯Emacs,可以獲得更大的整數。)

0

這僅適用於32位體系結構,並且可以根據構建選項進行更改。其他位用於標記基本數據結構。

您可以使用具有較大整數的64位版本,並且有用於任意大整數算術的程序包。

或者,你只是在尋求一個反問要健全生氣,重要...

1

在許多Lisp的實現,有的一個字位被用於標籤。這讓垃圾收集器等事情知道什麼是指針,什麼不是無需猜測。

爲什麼你在乎Elisp fixnum有多大?您可以照原樣打開巨大的文件。

3

其他三位用作對象類型的標籤。過去,這是如此普遍,一些CPU架構包括至少用於加標籤的整數在其指令集一些支持: SparcAlphaBurroughsK-Machine例如。現在,我們讓Lisp運行時處理標籤,而不需要額外的硬件支持。如果您想快速瞭解歷史,我建議您閱讀關於Sparc的第一個鏈接。

5

其他人已經評論了爲什麼fixnums只有29位寬。但如果你想要一個程序員的計算器,請查看calc。它提供了任意精度的整數,矩陣運算,單位轉換,通過gnuplot的圖形,統計函數,財務函數,科學函數,RPN和代數符號,公式簡化......並且它已經是Emacs的一部分,因此要開始,請訪問「calc」的信息節點,並從教程開始。

1

我使用Common Lisp解釋器CLISP作爲程序員的計算器。 Common Lisp具有我在任何編程語言中看到的最精確的數字處理;最值得注意的是,它有任意大小的整數,即bignums以及有理數。它還可以輸入任意數量的基數和位數函數。如果您想從Emacs中進行計算,您可以在M-x shell中運行CLISP。作爲獎勵,語法與您在Emacs Lisp中使用的語法幾乎完全相同。

相關問題