如何在Lisp中将某个基数的数字转换为基数10?有没有一个defaut函数可以做到这一点,如果没有,我该如何构建这个函数?
在我对您先前问题的回答的评论中,https://stackoverflow.com/q/33634012/1281433,你(含蓄地)问了这个问题:
我还需要做反向函数(将任何基数中的数字转换为基数10),我不知道:(
我回答说,希望你能访问文档,"Common Lisp HyperSpec非常全面。我建议你寻找名称以parse-开头的函数。"为了更清楚地说明这一点,如果你在索引中指向p,有一个函数parse integer正是你想要的。在我看来,这比在另一个答案中使用*read-base*和read的方法更安全,因为使用read析整数正是你想要的:
(parse-integer "9" :radix 16) ;=> 9
(parse-integer "10" :radix 16) ;=> 16
(parse-integer "1af" :radix 16) ;=> 431
(parse-integer "111" :radix 2) ;=> 7
整数基础仅在可视化和解释方面有趣。因此,"10"是十进制的10、八进制的8和十六进制的16的可视化,但这个数字在内存中看起来不像。
您可以使用*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