【问题标题】:Why does this loop print the value from the previous iteration?为什么这个循环会打印上一次迭代的值?
【发布时间】:2012-11-18 22:35:52
【问题描述】:

我有一个循环:

(defun echo-lines ()
  (loop while 
        (let ((line (read-line)))
           (if (equal line "done")
               nil
               (print line)))))

我希望它在用户结束行后回显用户的输入,除非他们输入了“完成”,在这种情况下它会停止。相反,它第一次回显一个空行,之后,它回显前一个的输入。 示例:

* (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

预期:

* (echo lines)
Hello, loop.
"Hello, loop."
done
NIL

【问题讨论】:

    标签: loops lisp common-lisp


    【解决方案1】:

    效果是由缓冲输出和PRINT的定义混合造成的。

    PRINT 如果底层输出流被缓冲,则不会立即写入输出。还要注意PRINT 打印换行符first。请注意,对于可移植代码,您应该假设输出流是缓冲的。这意味着您需要确保在需要时写入缓冲输出。使用FORCE-OUTPUT(不等待)和FINISH-OUTPUT(等待)。

    这是一个稍微改写的版本。

    (defun echo-lines ()
      (loop for line = (read-line)
            until (equal line "done")
            do
            (write-line line)
            (finish-output)))
    

    【讨论】:

    • 这清楚地回答了我的问题并提供了正确的解决方案。谢谢! =]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2019-03-26
    • 1970-01-01
    • 2023-01-16
    • 2019-11-30
    • 2021-10-14
    • 2017-02-12
    相关资源
    最近更新 更多