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

在Lisp中将某个基数转换为基数10,lisp,common-lisp,base,Lisp,Common Lisp,Base,在Lisp中,如何将数字从某个基数转换为基数10? 是否有任何defaut函数可以做到这一点,如果没有,我如何构建该函数 整数的基数仅在可视化和解释方面有趣。因此,“10”是十进制的10,八进制的8,十六进制的16的可视化,但是数字看起来不像内存中的数字 您可以使用*打印基*更改表示法: (let ((*print-base* 8)) (print 10)) ; ==> 10, but displays "12" 为什么打印12是因为打印时*print base*是8,而REPL

在Lisp中,如何将数字从某个基数转换为基数10?
是否有任何defaut函数可以做到这一点,如果没有,我如何构建该函数

整数的基数仅在可视化和解释方面有趣。因此,“10”是十进制的10,八进制的8,十六进制的16的可视化,但是数字看起来不像内存中的数字

您可以使用
*打印基*
更改表示法:

(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

整数的基数仅在可视化和解释方面有趣。因此,“10”是十进制的10,八进制的8,十六进制的16的可视化,但是数字看起来不像内存中的数字

您可以使用
*打印基*
更改表示法:

(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
在对您先前问题的评论中,您(暗示)询问了以下问题:

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

我回答说,希望您能够访问文档,“常见的Lisp HyperSpec非常全面。我建议您查找名称以parse-开头的函数。”为了更清楚地说明这一点,如果您转到,则有一个函数可以完全满足您的要求。在我看来,这比在另一个答案中使用*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),但我不知道:(

我回答说,希望您能够访问文档,“常见的Lisp HyperSpec非常全面。我建议您查找名称以parse-开头的函数。”为了更清楚地说明这一点,如果您转到,则有一个函数可以完全满足您的要求。在我看来,这比在另一个答案中使用*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

相关(向另一个方向):你的问题,来自21小时前。@AniFlorinAdrian这是一个非常简单的问题,除非你根本不努力。你可以用谷歌搜索“lisp integer base”并快速找到解决方案。相关(向另一个方向):你的问题,来自21小时前。@AniFlorinAdrian这是一个非常简单的问题,除非你不费吹灰之力。你可以在谷歌上搜索“lisp integer base”并快速找到解决方案。不过,阅读时要小心。Common lisp有尖锐的符号点,允许读者进行评估。例如,
(let((*read base*16))(使用字符串输入(在“#”(progn(print'hello)'f)”)(read-in))
将返回15(值为“f”),但也将打印hello(但可能已经注入了任意代码)。@JoshuaTaylor我同意。仅解析整数<代码>解析整数更好。禁用读卡器宏的方法在(搜索页面中的“读卡器安全性”)。这只是设置为零的问题,不是吗?@JoshuaTaylor是的,但还有一些更微妙的例子允许使用一些读卡器宏。不过,请注意阅读。Common Lisp有尖锐的符号点,允许读卡器进行求值。例如,
(let((*read base*16))(使用字符串输入(在“#(progn(print'hello)'f)”)(读入))
将返回15(值为“f”),但也将打印HELLO(但可能已经插入了任意代码)。@JoshuaTaylor我同意。对于仅解析整数,解析整数更好。中提供了禁用读卡器宏的方法(搜索页面中的“读卡器安全性”).这只是设置为零的问题,不是吗?@JoshuaTaylor是的,但还有更微妙的例子允许一些读卡器宏。