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

神秘的换行符出现在 Common Lisp 格式指令中

如何解决神秘的换行符出现在 Common Lisp 格式指令中

我遇到了 Common Lisp 的 format 指令的一个奇怪问题,该指令仅在 GNU CLISP 中显示,这让我怀疑它是否是实现中的错误

考虑下面的代码

(defun f (s args)
  (format nil "~A~{~A~%~}" s args))

函数 f 产生一个s 参数组成的字符串,后跟每个参数,其中每个参数(但不是标题)后跟一个换行符。因此,例如,我希望

(format t "~A" (f "foo" '("arg1" "arg2")))

生产

fooarg1
arg2

它确实做到了。现在,考虑以下调用

(format t "~A" (f "a" ()))
(format t "~A" (f "b" ()))
(format t "~A" (f "c" '("d")))

鉴于我打印出的唯一换行符是 f 的第二个参数中的元素,并且前两次调用为第二个 f 参数传递了一个空列表,我希望看到没有换行直到最后,即我希望打印

abcd

它在 SBCL 中正是这样做的。但是,在 GNU CLISP 中,我得到

ab
cd

注意 bc间的换行符。

修改代码

(format t "~S" (f "a" ()))
(format t "~S" (f "b" ()))
(format t "~S" (f "c" '("d")))

显示以下结果,甚至更不具启发性

"a""b"
"cd
"

所以 bc间的换行符不是任何一个字符串的一部分。为什么 CLISP 决定在这format 语句之间打印换行符?我怎样才能阻止它这样做?

解决方法

这是 GNU CLISP 的一个特性。请参阅documentation of *pprint-first-newline*

如果您想要不同的输出,请在 *print-pretty* 调用期间将 *pprint-first-newline*format 绑定到 nil。

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