der*_*ekv 3 lisp loops common-lisp
我有一个循环:
(defun echo-lines ()
(loop while
(let ((line (read-line)))
(if (equal line "done")
nil
(print line)))))
Run Code Online (Sandbox Code Playgroud)
我希望它在结束行之后回显用户的输入,除非他们输入"done",在这种情况下它会停止.相反,它第一次回到空白行,之后,它回显前一个输入.例:
* (echo-lines)
Hello, loop.
This is my second line.
"Hello, loop."
This is my third.
"This is my second line."
I'm almost done.
"This is my third."
done
"I'm almost done."
NIL
Run Code Online (Sandbox Code Playgroud)
预期:
* (echo lines)
Hello, loop.
"Hello, loop."
done
NIL
Run Code Online (Sandbox Code Playgroud)
这种效果是由缓冲输出和定义的混合引起的PRINT.
PRINT如果底层输出流被缓冲,则不会立即写入输出.另请注意,首先PRINT打印换行符.请注意,对于可移植代码,您应该假设输出流是缓冲的.这意味着您需要确保在需要时写入缓冲输出.使用(不等待)和(等待).FORCE-OUTPUTFINISH-OUTPUT
这是一个稍微改写的版本.
(defun echo-lines ()
(loop for line = (read-line)
until (equal line "done")
do
(write-line line)
(finish-output)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |