论unread-char
的Common Lisp的HyperSpec页面 - 见 here - 它说以下两个方面:偏离规范的未读字符行为?
“未读炭旨在成为一个有效的机制,以允许Lisp的读卡器等 解析器在输入流中执行单字符预览。“
“这是一个错误在相同流连续两次调用未读炭没有 居间调用读取炭(或隐含地读取字符某种其它输入动作)在该流 ”。
我研究如何增加对多字符先行支持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
之间的流上。
这种行为对多字符lookahead来说是个好消息,只要它是一致的,但为什么 不是被抛出的错误?
我假设开发人员在字符串处于内存时未读取字符串输入流上的多个字符时发出信号错误,并且unreading实际上只是递减当前索引。在CLISP中为 – jkiiski
,这是一个错误 –