以下是一些格式和princ调用的行为:
(format nil "a")
"a"
CL-USER>
(format t "a")
a
NIL
CL-USER>
(princ "a" nil)
a
"a"
CL-USER>
(princ "a" t)
a
"a"
CL-USER>
我原以为(princ "a" nil)
调用会返回“a”,但不会将“a”打印到stdout,但它仍然会向stdout输出“a”。另外我不确定为什么第一和第二次princ调用之间没有区别。
我尝试浏览超标准,但我找不到我需要的信息。
我认为我的误解是因为nil
和t
不是流,但是格式将它们转换为返回流(无论是什么)和stdout。如果是这种情况,我如何使用(format nil ...)
(princ ... ?)
效果
答案 0 :(得分:2)
函数FORMAT
与其他输出函数的不同之处在于它接受NIL
表示“以字符串形式返回输出而不是写入”。 Rainer建议的一般解决方案是使用WITH-OUTPUT-TO-STRING
。
通常,有一些特殊版本的打印函数可以将输出作为字符串返回。在这种特殊情况下,你想要的是函数PRINC-TO-STRING
,它与PRINC
做同样的事情,但返回一个字符串。
答案 1 :(得分:1)
CL-USER 25 > (with-output-to-string (stream)
(princ "a" stream))
"a"