2012-01-11 45 views
6

Trong thực tế, tôi không hoàn toàn hiểu được việc sử dụng setf trong defun:Giới thiệu về "setf" trong "defun"?

(defun cookies-out* (&optional (reply *reply*)) 
"Returns an alist of the outgoing cookies associated with the REPLY object REPLY." 
    (cookies-out reply)) 

(defun (setf cookies-out*) (new-value &optional (reply *reply*)) 
"Sets the alist of the outgoing cookies associated with the REPLY object REPLY." 
    (setf (cookies-out reply) new-value)) 

Tôi cho rằng nó định nghĩa lại các chức năng # 'cookie-out *, đúng chứ? Nếu có, thì #'cookies-out* sẽ là một hàm đa hình.

Trân trọng!

+7

Tìm kiếm "bộ mở rộng tập hợp" và xem [this] (http://www.chemie.fu-berlin.de/chemnet/use/info/cl/cl_4.html#SEC19). – Daimrod

Trả lời

14

Đoạn mã của bạn không xác định lại bất kỳ chức năng nào. Về cơ bản nó là “mở rộng” khả năng phân công của Common Lisp - một trong những tính năng tuyệt vời của ngôn ngữ. Nếu ai đó cố gắng (setf (cookie-out * ...) ...), thì đoạn mã sau của bạn sẽ được sử dụng để thực hiện nhiệm vụ đó.

Một người nhận xét về câu hỏi của bạn đã đề cập đến những “bộ mở rộng tập hợp” này và để giải thích về điều này, bạn có thể thấy hữu ích khi đọc các mục sau đây từ CLHS. Lưu ý rằng ví dụ của bạn sử dụng biểu mẫu (defun (setf ...) ...) và do đó hai liên kết đầu tiên áp dụng.

defun cho phép bạn xác định một hàm sẽ được chạy cho một SETF.

DEFSETF cho phép bạn đặt tên cho một chức năng (dưới hình thức ngắn) để thực hiện công việc, hoặc xác định một vĩ mô (theo hình thức dài) sẽ được mở rộng cho một SETF, và bạn thường phải cẩn thận sử dụng PROGN một cách thích hợp cho trường hợp sau.

DEFINE-SETF-EXPANDER được sử dụng khi biểu mẫu dài của DEFSETF không đủ, mặc dù tôi chưa bao giờ có lý do để sử dụng nó. Xem chủ đề comp.lang.lisp này đối với một số thông tin hữu ích trên rằng: https://groups.google.com/forum/#!searchin/comp.lang.lisp/difference $ 20between $ 20defsetf $ 20defun $ 20setf/comp.lang.lisp/5x3fjzMQ6Q0/_y8Q-P-SVPQJ

Nó đã được kinh nghiệm cá nhân của tôi rằng cần phải viết bộ mở rộng SETF của riêng tôi là hiếm, vì tôi viết nhiều hơn và nhiều hơn nữa mã của tôi theo kiểu "chức năng". Điều đó nói rằng, khi tiếp cận các cấu trúc phức tạp để thực hiện các sửa đổi, nó thường có thể chứng minh là một kỹ thuật rất tiện dụng… ít nhất là cho đến khi tôi hiểu liệu các ống kính chức năng có phải là một giải pháp thay thế khả thi hay không.

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