2010-09-25 27 views
6

Đây là mã để thực hiện các lệnh 'mèo' với lisp, như được giải thích trong cuốn sách ANSI Common Lisp, trang 122.Tại sao đọc dòng chạy hai lần để đọc từ một tệp trong 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)))) 

Tại sao là chức năng đọc dòng chạy hai lần? Tôi đã cố gắng chạy nó chỉ với một dòng đọc, nhưng Lisp không thể hoàn thành mã.

Trả lời

11

Cú pháp của biến DO là: biến, hình thức khởi tạo, hình thức cập nhật. Trong trường hợp này, biểu mẫu khởi tạo giống như biểu mẫu cập nhật. Nhưng không có viết tắt cho trường hợp đó trong DO, vì vậy bạn phải viết nó ra hai lần.

0

Bạn có thể sử dụng (listen file) để kiểm tra xem bạn có thể đọc từ tệp không.

Đây là chức năng của tôi in tập tin

(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))))) 
+0

nhiều cuộc trò chuyện và sử dụng định dạng để tạo chuỗi mới thực sự lãng phí. Đừng làm thế. –

+0

Đó là một cách tiếp cận sai vì nó sẽ tạo ra kết quả sai. Ví dụ. nếu bạn vượt qua tên của ống được đặt tên trong linux hoặc windows, nó có thể sẽ không được immediatelly sẵn sàng cho đầu vào, do đó nghe sẽ trả về NIL và chức năng sẽ trở lại mà không thực sự sao chép bất cứ điều gì. –

5

Bạn cần phải đọc cú pháp của DO: http://www.lispworks.com/documentation/HyperSpec/Body/m_do_do.htm

Hình thức read-line đầu tiên là init-form và thứ hai là bước dạng. Vì vậy, trong lần lặp đầu tiên biến được đặt thành kết quả của init-form. Trong các lần lặp tiếp theo, biến được đặt thành giá trị của bước.

+0

+1 để cung cấp liên kết –

Các vấn đề liên quan