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

时间:2010-09-25 23:20:24

标签: input lisp common-lisp

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

(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无法完成代码。

3 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

如果您可以从文件中读取,可以使用(listen file)进行测试。

这是我的打印文件功能

(defun print-file (filename)
  "Print file on stdout."
  (with-open-file (file filename :direction :input)
          (loop
             (when (not (listen file)) (return))
             (write-line (read-line file)))))