lisp - common lisp 在格式之后调用 read-line 会在 Clozure CL 实现中产生额外的换行符

标签 lisp common-lisp

我正在阅读 Practical Common Lisp 这本书,其中有一段代码,并且我正在使用 Clozure CL 实现:

(defun prompt-read (prompt)
 (format *query-io* "~a:" prompt)
 (force-output *query-io*)
 (read-line *query-io*))

成功定义该函数后,我通过以下方式调用它

(prompt-read "Hello")

然后输入“hello”并按下回车键,输出如下:

CL-USER> (prompt-read "Hello")
Hello:hello

"hello"
NIL

添加了一个额外的空行,我尝试了下面的代码,没有额外的换行符:

(defun test-read ()
 (read-line *query-io*))

然后执行,结果是这样的:

CL-USER> (test-read)
hello
"hello"
NIL

这次没有产生额外的空行,实际上我发现每次read-line跟随一个format函数时,都会产生一个空行。我尝试了Clisp实现中的代码,两种情况都没有产生空行,我只想知道为什么会出现空行,另一个问题是read-line是否返回两个值?因为我每次输入的字符串后面都会看到一个NIL,这个NIL是什么意思?

感谢您的帮助!

最佳答案

这是 Clozure CL 与 SLIME 读取-评估-打印循环 (REPL) 的交互。 native Clozure CL REPL 不会这样做。

; SLIME 2014-05-16
CL-USER> (defun prompt-read (prompt)
           (format *query-io* "~a:" prompt)
           (force-output *query-io*)
           (read-line *query-io*))
PROMPT-READ
CL-USER> (prompt-read "Hello")
Hello:hello

"hello"
NIL

如果多次调用它,您会发现代码没有添加换行符,但 REPL 在完成某些输出时在输出和返回值之间打印一行。

CL-USER> (progn (prompt-read "Hello")
                (prompt-read "Hello")
                (prompt-read "Hello"))
Hello:hello
Hello:hello
Hello:hello

"hello"
NIL

每个 Lisp 实现都有一些针对 SLIME 后端的特殊代码。也许有区别。

关于lisp - common lisp 在格式之后调用 read-line 会在 Clozure CL 实现中产生额外的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25656148/

相关文章:

lisp - 普通口齿不清 : getting all keys of a given hash table as a list

java - Clojure/Java Mandelbrot 分形绘图

programming-languages - 有人知道如何获得 Linux 的 SAM76 源代码吗?

lisp - Lisp 中的反引号扩展

scheme - 服务器端的 Common Lisp 还是 Scheme?

function - SBCL 时间函数返回什么?

lisp - Lisp 文件扩展名的约定是什么?

Lisp 可分性

import - 用普通的 lisp 加载文件

oop - 如何在common lisp/CLOS中定义和调用类方法