2010-08-13 16 views
7

Tôi đang học CL và tôi có ít kinh nghiệm về các ngôn ngữ khác. ai đó có thể giải thích cho tôi về giáo dân điều này có nghĩa, đặc biệt là những gì "out" ở đây đại diện, và làm thế nào nó tất cả phù hợp với nhau:giải thích với tập tin mở trong các thuật ngữ của người cư trú

(defun save-db (filename) 
    (with-open-file (out filename 
        :direction :output 
        :if-exists :supersede) 
    (with-standard-io-syntax 
     (print *db* out)))) 

Chủ yếu, các bit Tôi không hiểu là "out", nhưng một giải thích về toàn bộ điều sẽ tốt đẹp.

Cảm ơn

Trả lời

5

là biến luồng được liên kết với tệp đang mở. with-open-file đảm bảo rằng tệp được mở trong phạm vi và đóng ngoài phạm vi, bất kể bạn thoát ra sao.

+0

Làm cách nào để tôi có thể tải trang man mô tả những thứ như vậy trên Linux cho CL? – agd

+2

Manpages là một truyền thống Unix, và Lisp xuất phát từ một nền văn hóa rất khác biệt. Nói chung, tôi google "hyperspec" + (bất kỳ thuật ngữ nào tôi tò mò). – Ken

+1

Hoặc, trong nhiều trường hợp, bạn có thể sử dụng hệ thống doc tích hợp của Lisp: '(tài liệu 'hàm foo')' sẽ tra cứu tài liệu cho hàm hoặc macro 'foo'. Đáng buồn thay, điều này dường như bị thiếu trong SBCL cho trường hợp cụ thể của 'with-open-file'. –

1

Như một sự bổ sung để ddyer, bạn cũng có thể sử dụng MACROEXPAND hoặc MACROEXPAND-1 để xem những gì WITH-OPEN-FILE làm:

(macroexpand '(with-open-file (out filename 
           :direction :output 
           :if-exists :supersede) 
       (with-standard-io-syntax 
       (print *db* out)))) 

cho chúng ta biết

(LET ((OUT (OPEN FILENAME :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)) (#:G748 T)) 
    (UNWIND-PROTECT 
     (MULTIPLE-VALUE-PROG1 (PROGN (WITH-STANDARD-IO-SYNTAX (PRINT *DB* OUT))) 
     (SETQ #:G748 NIL)) 
    (WHEN OUT (CLOSE OUT :ABORT #:G748)))) 

Chúng ta có thể thấy rằng chúng ta mở tập tin gọi là filename và chỉ định luồng tệp mở thành out và thực hiện điều gì đó. Nếu có điều gì đó xấu xảy ra, UNWIND-PROTECT sẽ CLOSE luồng, nếu không phải là nil.

Biến số #:G748 là biểu tượng số GENSYM (vì vậy đây là biểu tượng mới, không có người dùng). Nếu không có gì sai khi viết tệp, chúng tôi đặt #:G748 thành nil.

Vì vậy, khi chúng ta CLOSE suối, nếu có điều gì đó đã đi sai #:G748 sẽ T, vì vậy CLOSE sẽ cố gắng để làm sạch bất kỳ tác dụng phụ là đã tạo ra suối.

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