2012-01-11 11 views
6

In realtà, io non capisco pienamente l'utilizzo di setf in defun:Informazioni su "setf" in "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)) 

Suppongo che ridefinisce il concetto di biscotti-out la funzione # '*, non è vero? Se è così, allora #'cookies-out* sarà una funzione polimorfica.

Cordiali saluti!

+7

Cercare "estensioni setf" e consultare [questo] (http://www.chemie.fu-berlin.de/chemnet/use/info/cl/cl_4.html#SEC19). – Daimrod

risposta

14

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.