2012-07-12 11 views
11

Aquí está la cosa: no "obtengo" setf-expanders y me gustaría aprender cómo funcionan.definiendo setf-expanders en Common Lisp

Necesito aprender cómo funcionan porque tengo un problema que parece como un típico ejemplo de por qué usted debe aprender setf-expansores, el problema es el siguiente:

(defparameter some-array (make-array 10)) 

(defun arr-index (index-string) 
    (aref some-array (parse-integer index-string)) 

(setf (arr-index "2") 7) ;; Error: undefined function (setf arr-index) 

¿Cómo se escribe un setf-expander adecuado para ARR-INDEX?

Respuesta

15
(defun (setf arr-index) (new-value index-string) 
    (setf (aref some-array (parse-integer index-string)) 
     new-value)) 

En Common Lisp una function name no sólo puede ser un símbolo, sino también una lista de dos símbolos con SETF como el primer símbolo. Véase más arriba. DEFUN por lo tanto, puede definir SETF funciones. El nombre de la función es (setf arr-index).

A setf función se puede utilizar en un lugar formulario: CLHS: Other compound forms as places.

El primer valor es el primer argumento.

CL-USER 15 > some-array 
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL) 

CL-USER 16 > (setf (arr-index "2") 7) 
7 

CL-USER 17 > some-array 
#(NIL NIL 7 NIL NIL NIL NIL NIL NIL NIL) 
+0

No pude encontrar esto en el CLHS, ¿dónde está? –

+0

@Nowhereman: http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f.htm#function_name –

+0

Lo había visto en el glosario, pero ¿dónde se explica cómo definir una función setf con (defun (setf) foo) ...)? –

2

Rainer's contest is spot on. Antes de ANSI Common Lisp, era necesario usar defsetf para definir un expansor para lugares simples que se podían establecer con una llamada a función simple. setf funciones como (setf arr-index) entraron en el lenguaje con CLOS y simplifican muchas cosas. En particular, las funciones setf pueden ser genéricas.