微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将数字转换为字符串:write-to-string vs prin1-to-string vs princ-to-string

如何解决将数字转换为字符串:write-to-string vs prin1-to-string vs princ-to-string

假设我在 Common Lisp 中有一个数字,我想把它转换成一个字符串。至少有三个函数可以将数字转换为字符串:write-to-stringprin1-to-stringprinc-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"

FORMAT 也可以创建字符串:

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

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

我认为值得指出的是,在使用任何或所有 write-to-stringprin1-to-string、和princ-to-string

举个例子:

> (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 调度表执行一些有趣的操作。

这可能是潜伏的最大怪物,但还有其他较小的怪物:*print-base* *print-radix* 其中。

如果您想确保获得的输出是您期望的输出,那么至少您应该用 (with-standard-io-syntax ...) 包围对这些函数的调用。

使用 format(如在 (format nil "~D" n) 中)更安全(您不再需要关心 *print-base**print-radix* 之类的东西)但它仍然容易受到环境的影响*print-pretty* 的值,因此与 pprint 调度表的上述游戏。我相信(但不完全确定)

(let ((*print-pretty* nil))
  (format nil "~D" 13))

应该返回字符串"13"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。