Lo snippet di codice non ridefinisce alcuna funzione. In sostanza, "estende" le capacità di assegnazione di Common Lisp - una delle belle funzionalità del linguaggio. Se qualcuno tenta di (setf (cookie-out * ...) ...), allora il tuo ultimo frammento di codice sarà usato per eseguire quell'assegnazione.
Un commentatore sulla tua domanda ha già menzionato questi "espansatori di setf", e per elaborare questo, potresti trovare utile leggere i seguenti elementi dal CLHS. Nota che il tuo esempio usa il modulo (defun (setf ...) ...), e quindi si applicano i primi due collegamenti.
Defun consente di definire una funzione che verrà eseguito per un SETF.
DEFSETF vi permette di nominare una funzione (in forma breve) per fare il lavoro, o di definire una macro (nella forma lunga) che verrà ampliato per un SETF, e di solito deve essere attento a usare PROGN in modo appropriato per quest'ultimo caso.
DEFINE-SETF-EXPANDER viene utilizzato dove il modulo lungo di DEFSETF non è sufficiente, sebbene non abbia mai avuto motivo di usarlo. Vedere questa discussione comp.lang.lisp alcune informazioni utili su che: https://groups.google.com/forum/#!searchin/comp.lang.lisp/difference $ 20between $ 20defsetf $ 20defun $ 20setf/comp.lang.lisp/5x3fjzMQ6Q0/_y8Q-P-SVPQJ
E 'stata la mia esperienza personale che il è necessario scrivere i miei espansori SETF è raro, dato che scrivo sempre più del mio codice in uno stile "funzionale". Detto questo, quando si raggiungono strutture complesse per apportare modifiche, può spesso rivelarsi una tecnica molto utile ... almeno finché non capisco se le lenti funzionali sono un'alternativa fattibile/desiderabile.
fonte
2012-01-16 00:42:15
Cercare "estensioni setf" e consultare [questo] (http://www.chemie.fu-berlin.de/chemnet/use/info/cl/cl_4.html#SEC19). – Daimrod