Common lisp 将数字转换为字符串:写入字符串vs prin1到字符串vs princ到字符串

Common lisp 将数字转换为字符串:写入字符串vs prin1到字符串vs princ到字符串,common-lisp,Common Lisp,假设我在CommonLisp中有一个数字,我想把它转换成一个字符串。至少有三个函数可以将数字转换为字符串:write to string、prin1 to string、以及princ to string 据我所知,这三个函数在数字上使用时给出相同的结果。真的是这样吗?是否有我应该注意的边缘情况?我应该使用哪个?应该没有区别,但WRITE-TO-STRING有关键字参数。对于其他两个函数的类似效果,需要在调用周围绑定一个打印机变量 CL-USER 1 > (write-to-string

假设我在CommonLisp中有一个数字,我想把它转换成一个字符串。至少有三个函数可以将数字转换为字符串:
write to string
prin1 to string
、以及
princ to string


据我所知,这三个函数在数字上使用时给出相同的结果。真的是这样吗?是否有我应该注意的边缘情况?我应该使用哪个?

应该没有区别,但WRITE-TO-STRING有关键字参数。对于其他两个函数的类似效果,需要在调用周围绑定一个打印机变量

CL-USER 1 > (write-to-string 12 :base 16)
"C"

CL-USER 2 > (let ((*print-base* 16))
              (prin1-to-string 12))
"C"
格式还可以创建字符串:

CL-USER 3 > (format nil "~16R" 12)
"C"

CL-USER 4 > (format nil "~vR" 16 12)
"C"

我认为值得指出的是,当使用任何或所有
写入字符串
prin1到字符串
、以及
普林斯到字符串
时,你需要对潜伏在角落里的屠杀怪物极其谨慎

作为一个例子,考虑如下:

> (dotimes (i 20)
    (print i))

0 
1 
2 
3 
4 
5 
six 
seven 
eight 
IX 
X 
XI 
XII 
XIII 
XII 
XIII 
XIII 
XIII 
XII 
XII 
nil
这是完全合法的输出,任何符合要求的实现都会产生它(或者事实上是类似的,因为涉及到一些随机数)

您可以通过将
*print pretty*
设置为true,然后对pprint调度表执行一些有趣的操作来实现这一点

这可能是潜伏的最大怪物,但也有其他较小的怪物:
*打印基数*
*打印基数*

如果您想确保得到的输出是您期望的输出,那么至少应该使用
(使用标准io语法…
)来包围对这些函数的调用

使用
格式
(如
(format nil”~D“n)
)更安全(您不再需要关心诸如
*打印基*
*打印基*
)之类的事情),但它仍然容易受到
*打印漂亮*
的环境值的影响,因此也容易受到上述具有pprint调度表的游戏的影响。我相信(但不是完全肯定)这一点


应该返回字符串
“13”

您是如何获得
(dotimes(i 20)(print i))
的输出的?@Flux:我现在不记得详细信息,但(ab)使用了漂亮的打印机界面。CL的漂亮打印机是。。。相当灵活。
(let ((*print-pretty* nil))
  (format nil "~D" 13))