为什么read-line运行两次从Lisp中的文件读取?

pro*_*eek 6 lisp input common-lisp

这是使用lisp实现'cat'命令的代码,如ANSI Common Lisp,第122页一书中所述.

(defun pseudo-cat (file)
  (with-open-file (str file :direction :input)
    (do ((line (read-line str nil 'eof)
               (read-line str nil 'eof)))
        ((eql line 'eof))
      (format t "~A~%" line))))

为什么读取线功能运行两次?我尝试只使用一个读取线运行它,但Lisp无法完成代码.

Xac*_*ach 11

DO变量的语法是:变量,初始化形式,更新形式.在这种情况下,初始化表单与更新表单相同.但在DO中没有这种情况的简写,所以你必须把它写出来两次.


Rai*_*wig 5

您需要阅读DO的语法:http://www.lispworks.com/documentation/HyperSpec/Body/m_do_do.htm

第一个READ-LINE表单是init-form,第二个是step-form.因此,在第一次迭代中,变量被设置为init-form的结果.在下一次迭代中,变量设置为步骤形式的值.