1

我正在使用 GNU CLISP 并且因为这个程序而变得疯狂:

(read-line)
(format t "~&<prompt RESPONSE")

输出类似:

my input...
<prompt RESPONSE

但是,如果我在 (read-line) 之前打印一个提示,我会得到一个虚假的空行:

(format t "~&prompt> ")
(read-line)
(format t "~&<prompt RESPONSE")

例如:

prompt> my input...

<prompt RESPONSE

我曾尝试在 read-line 之前和之后使用 (finish-output) ,但它没有帮助。我不明白那个空行是从哪里来的。我怀疑 CLISP 中存在错误。

4

1 回答 1

2

对于那些不知道的人,命令~&format有一个条件换行符,这意味着“如果需要,打印一个换行符”。也就是说,仅当 lisp 打印的最后一件事还不是换行符时才打印换行符。

format功能(至少在您的机器上!)在决定是否发出换行符时会忽略用户输入。并非所有系统都如此。我真的不记得了。

让我们关注~&紧接在前面的那个<prompt RESPONSE。在您的第一种情况下,format看到它尚未打印任何内容,因此不需要打印换行符。在第二种情况下format,它打印的最后一件事不是换行符,因此它需要打印换行符。

解决方案:知道用户将始终提供换行符,请不要将其包含在您的format语句中。如果您愿意,您甚至可以将其从初始提示中删除:

(format t "prompt> ")
(read-line)
(format t "<prompt RESPONSE")

那么问题来了,“那到底是~&为了什么?” 而且,确实,它还有其他用途。例如,要分隔 2 个连续的输出行:

(format t "prompt> ")
(read-line)
(format t "<prompt RESPONSE 1~&<prompt RESPONSE 2")
于 2012-03-09T06:25:40.287 回答