使用princ实现(格式为nil ...)

时间:2013-05-23 04:51:54

标签: common-lisp

以下是一些格式和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调用之间没有区别。

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

我认为我的误解是因为nilt不是流,但是格式将它们转换为返回流(无论是什么)和stdout。如果是这种情况,我如何使用(format nil ...)

获得(princ ... ?)效果

2 个答案:

答案 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"
相关问题