Common lisp 将数字转换为字符串:写入字符串vs prin1到字符串vs princ到字符串
假设我在CommonLisp中有一个数字,我想把它转换成一个字符串。至少有三个函数可以将数字转换为字符串: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
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))