这是使用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无法完成代码。
答案 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)))))