1

以下是一些 format 和 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”打印到标准输出,但它仍会将“a”打印到标准输出。另外我不确定为什么第一个和第二个 princ 调用之间没有区别。

我尝试浏览 hyperspec,但找不到我需要的信息。

我认为我的误解是因为nil并且t不是流,但格式将它们转换为返回流(无论是什么)和标准输出。如果是这样的话,我怎样才能得到(format nil ...)效果(princ ... ?)

4

2 回答 2

2

该函数FORMAT与其他输出函数的不同之处在于它接受NIL的意思是“以字符串形式返回输出而不是写入”。Rainer 建议的一般解决方案是使用WITH-OUTPUT-TO-STRING.

通常,有一些特殊版本的打印函数将输出作为字符串返回。在这种特殊情况下,您想要的是与PRINC-TO-STRING执行相同操作PRINC但返回字符串的函数。

于 2013-05-23T06:14:12.947 回答
1
CL-USER 25 > (with-output-to-string (stream)
               (princ "a" stream))
"a"
于 2013-05-23T05:35:21.023 回答