2015-11-11 18 views
0

轉換一個數字基地10我如何將數字轉換從某基地到Lisp的基地10? 是否有任何可以做到這一點的默認功能,如果沒有,我該如何建立該功能?從某基地的Lisp

+0

相關(打算在其他DIRECTI上):你的問題,[轉換在基座10的整數成在Lisp中1和9之間的任意基](http://stackoverflow.com/q/33634012/1281433)中,從22小時前。 –

+1

@AniFlorinAdrian這是一個非常簡單的問題,除非你沒有采取任何措施。你可以谷歌「lisp整數基地」,並迅速提出了一個解決方案。 – tonso

回答

3

基地整數僅在可視化和解釋方面的有趣。因此,「10」是十進制的可視化,八進制的八進制和十六進制的十六進制的可視化,但是該數字看起來不像內存中的那樣。

您可以更改表示與*print-base*

(let ((*print-base* 8)) 
    (print 10)) ; ==> 10, but displays "12" 

爲什麼它打印12是因爲當打印*print-base*8而REPL打印形式的結果後*print-base*是回全局值是。您閱讀的數字使用*read-base*

(let ((*read-base* 16)) 
    (with-input-from-string (in "10") (read in))) ; ==> 16 
+0

雖然,請仔細閱讀**閱讀**。 Common Lisp的sharpsign-dot允許讀者進行評估。例如,'(讓((*閱讀基地* 16))(與輸入 - 從字符串(如 「#(progn這個(打印 '你好)' F)」)(讀取)))'將返回15 (「f」的值),但也會打印** HELLO **(但可以注入任意代碼)。 –

+0

@JoshuaTaylor我同意。對於只是解析整數'parse-integer'更好。在[Let over lambda](http://letoverlambda.com/index.cl/guest/chap4.html)中提供了一種禁用閱讀器宏的方法(搜索「Reader security」頁面)。 – Sylwester

+0

這只是一個[\ *閱讀-EVAL \ *](http://www.lispworks.com/documentation/HyperSpec/Body/v_rd_eva.htm)設置爲** **爲零,無事? –

5

在評論my answer到你剛纔的問題,https://stackoverflow.com/q/33634012/1281433,你(隱含)被問及此事:

我也需要做反向功能(轉換一個號碼在任何基地到基地10),我不知道:(

我回答說,希望你能訪問文檔,「的C ommon Lisp HyperSpec非常全面。我建議你看看他們的名字開始與parse-功能。」爲了使這個更清楚,如果你去P in the index,有一個功能parse-integer但這正是你要找的東西。這是安全的,在我看來, ,比使用* read-base *讀取的方法在另一個答案中,因爲使用讀取打開你一堆問題(可以讀取非數字,可以有讀取時間評估等。 。)解析整數確實你剛纔問什麼:

(parse-integer "9" :radix 16) ;=> 9 
(parse-integer "10" :radix 16) ;=> 16 
(parse-integer "1af" :radix 16) ;=> 431 
(parse-integer "111" :radix 2) ;=> 7