2012-01-11 2 views
6

사실, 나는 완전히 defun는setf의의 사용을 이해하지 않습니다"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 expanders"를 검색하고 [this] (http://www.chemie.fu-berlin.de/chemnet/use/info/cl/cl_4.html#SEC19)를보십시오. – Daimrod

답변

14

코드 스 니펫이 기능을 재정의하지 않습니다. 이것은 본질적으로 Common Lisp의 할당 기능을 "확장"합니다.이 기능은 언어의 멋진 기능 중 하나입니다. 누군가 (setf (cookies-out * ...) ...)를 시도하면, 후자의 스 니펫 코드가 그 할당을 수행하는 데 사용됩니다.

귀하의 질문에 대한 코멘트 작성자는 이미이 "setf expanders"에 대해 언급했으며이를 상세히 설명하기 위해 CLHS에서 다음 항목을 읽는 것이 유용 할 수 있습니다. 예제에서는 (defun (setf ...) ...) 양식을 사용하므로 처음 두 링크가 적용됩니다.

DEFUN 당신이 함수를 정의 할 수 있습니다를 그것은 SETF에 대해 실행됩니다.

DEFSETF는 (짧은 형태)를 기능 일을 할, 또는 정의의 이름을 할 수있는 setf의 대한 확장, 당신은 일반적으로해야됩니다 (긴 형태) 매크로 후자의 경우 적절하게 PROGN을 사용하도록주의하십시오.

DEEFETF의 긴 형식이 충분하지 않은 경우 DEFINE-SETF-EXPANDER가 사용됩니다. 사용하지 않아도됩니다. 그에 대한 몇 가지 유용한 정보는이 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 익스팬더를 작성해야한다는 것은 드문 일입니다. 즉, 수정하기 위해 복잡한 구조에 도달 할 때, 기능 렌즈가 실현 가능/바람직한 대안인지 여부를 이해할 때까지는 매우 편리한 기술이 될 수 있습니다.

관련 문제