2012-01-11 23 views
6

其實,我不完全理解SETF的使用在defun定義關於「defun」中的「setf」?

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

我想它重新定義了功能#「餅乾出*,不是嗎?如果是這樣,那麼#'cookies-out*將是一個多態函數。

真誠!

+7

搜索 「SETF擴展」,並期待在[這](http://www.chemie.fu-berlin.de/chemnet/use/info/cl/cl_4.html#SEC19)。 – Daimrod 2012-01-11 09:41:20

回答

14

您的代碼段沒有任何重新定義的功能。它本質上是「擴展」Common Lisp的分配功能 - 這是該語言的一個很好的功能。如果有人試圖(setf(cookies-out * ...)...),那麼你的後面的代碼片段將被用來執行該分配。

在你的問題中評論者已經提到的這些「SETF擴展」,並詳細說明這一點,你可能會發現有用的信息從CLHS以下項目。請注意,您的示例使用(defun(setf ...)...)表單,因此應用前兩個鏈接。

defun定義允許你定義一個功能這將爲SETF運行。

DEFSETF允許你命名一個功能(縮寫形式)來完成這項工作,或定義(在漫長的形式),將一個SETF擴大,而你通常是謹慎使用PROGN適合後者的情況。

DEFINE-SETF - 膨脹用在DEFSETF的長期形式是不夠的,雖然我從未有過的原因使用它。看到這個comp.lang.lisp線程上一些有用的信息:https://groups.google.com/forum/#!searchin/comp.lang.lisp/difference $ 20between $ 20defsetf $ 20defun $ 20setf/comp.lang.lisp/5x3fjzMQ6Q0/_y8Q-P-SVPQJ

這一直是我個人的經驗是,需要編寫自己的SETF擴展器很少見,因爲我以「功能」風格編寫越來越多的代碼。這就是說,深入到複雜的結構時進行修改,它往往被證明是一個非常有用的技術......至少,直到我明白功能的鏡頭是否是一個可行的/理想的辦法。