2012-01-11 9 views
6

De hecho, no entiendo por completo el uso de setf en defun:Acerca de "setf" en "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)) 

supongo que redefine las cookies-a cabo la función # '*, ¿no es así? Si es así, entonces #'cookies-out* será una función polimórfica.

¡Sinceramente!

+7

Busque "expansores de setf" y mire [esto] (http://www.chemie.fu-berlin.de/chemnet/use/info/cl/cl_4.html#SEC19). – Daimrod

Respuesta

14

Su fragmento de código no está redefiniendo ninguna función. Es esencialmente "ampliar" las capacidades de asignación de Common Lisp, una de las características más agradables del lenguaje. Si alguien intenta (setf (cookies-out * ...) ...), su último fragmento de código se utilizará para realizar esa tarea.

Un comentarista en su pregunta ya ha mencionado estos "expansores de setf", y para más detalles, puede resultarle útil leer los siguientes elementos de CLHS. Tenga en cuenta que su ejemplo utiliza el formulario (defun (setf ...) ...), por lo que se aplican los primeros dos enlaces.

DEFUN permite definir una función eso se ejecutará para un SETF.

DEFSETF le permite nombrar una función (en la forma corta) para hacer el trabajo, o definir un macro (en la forma larga) que será ampliado para una SETF, y por lo general tiene que ser cuidado de usar PROGN apropiadamente para este último caso.

DEFINE-SETF-EXPANDER se utiliza cuando la forma larga de DEFSETF no es suficiente, aunque nunca he tenido motivos para usarla. Ver este hilo comp.lang.lisp por alguna información útil sobre las que: https://groups.google.com/forum/#!searchin/comp.lang.lisp/difference $ 20between $ 20defsetf $ 20defun $ 20setf/comp.lang.lisp/5x3fjzMQ6Q0/_y8Q-P-SVPQJ

Ha sido mi experiencia personal que la necesito escribir mis propios expansores SETF es raro, dado que escribo más y más de mi código en un estilo "funcional". Dicho esto, cuando nos acercamos a estructuras complejas para hacer modificaciones, a menudo puede resultar una técnica muy útil ... al menos hasta que entiendo si las lentes funcionales son una alternativa factible/deseable.