在Lisp中将数字从某个基数转换为基数10

时间:2015-11-11 09:31:31

标签: lisp common-lisp base

如何在Lisp中将数字从某个基数转换为基数10? 是否有任何defaut功能可以做到这一点,如果不是我怎么能补充该功能?

2 个答案:

答案 0 :(得分:5)

my answer对您之前的问题https://stackoverflow.com/q/33634012/1281433的评论中,您(含蓄地)询问了这一点:

  

我还需要做反向功能(将任何基数中的数字转换为基数10),我不知道:(

我回答说,希望您访问文档,“Common Lisp HyperSpec非常全面。我建议您查找名称以解析 - 开头的函数。”为了更清楚,如果你去P in the index,有一个函数parse-integer可以完全满足您的要求。在我看来,这比在另一个答案中使用 * read-base * read 的方法更安全,因为使用 read 可以打开你对一堆问题(你可以阅读非数字,可以有阅读时间评估等)。 parse-integer 可以满足您的要求:

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

答案 1 :(得分:3)

整数基数只在可视化和解释方面很有意义。因此" 10"是十进制的十进制,八进制的八进制和十六进制的十六进制的可视化,但数字在内存中看起来不像。

您可以使用*print-base*更改代表:

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

为什么它打印12是因为当*print-base*打印8*print-base*回到全局值时,表格的结果是*read-base*。您可以使用(let ((*read-base* 16)) (with-input-from-string (in "10") (read in))) ; ==> 16 来读取数字:

{{1}}