在 Common Lisp HyperSpec 页面上unread-char
- 请参见
此处- 它说明了以下两件事:
“unread-char 旨在成为一种有效的机制,允许 Lisp 阅读器和其他解析器在输入流中执行单字符前瞻。”
“在同一流上连续两次调用 unread-char 而不在该流上调用 read-char (或其他一些隐式读取字符的输入操作)是错误的。”
我正在研究如何为我打算编写的解析器添加对 CL 流的多字符前瞻的支持,为了确认上述内容,我运行了以下代码:
(defun unread-char-test (data)
(with-input-from-string (stream data)
(let ((stack nil))
(loop
for c = (read-char stream nil)
while c
do (push c stack))
(loop
for c = (pop stack)
while c
do (unread-char c stream)))
(coerce
(loop
for c = (read-char stream nil)
while c
collect c)
'string)))
(unread-char-test "hello")
==> "hello"
它不会引发错误(在 SBCL 或 CCL 上,我尚未在其他实现上对其进行测试)但我看不出如何在流之间发生任何读取操作(隐式或显式)连续调用unread-char
.
这种行为对于多字符前瞻来说是个好消息,只要它是一致的,但为什么不抛出错误呢?