Intentando entender qué setfpuedo hacer, llamé
(macroexpand '(setf (aref vec i) val))
⇒ (let* ((v vec) (v i)) (aset v v val))
Esto parece obviamente incorrecto.
Sin embargo, no pude crear una instancia real donde (setf (aref ..falla. P.ej
(setq vec (make-vector 10 nil) i 3 val 'foo)
⇒ foo
(setf (aref vec i) val)
⇒ foo
vec
⇒ [nil nil nil foo nil nil nil nil nil nil]
¿Alguien puede explicar lo que está pasando aquí?
elisp-macros
setf
phs
fuente
fuente

vsímbolos no son lo mismo y(let* ((form (macroexpand '(setf (aref vec i) val))) (symb1 (caar (cadr form))) (symb2 (caar (cdadr form)))) (equal symb1 symb2))regresanil.setfen el archivo de origengv.elparece crear losvsímbolos con un uso de la vainilla(gensym "v")y esto se debe agregar un valor de contador después del prefijo "v", la creación de símbolos uninternedv0,v1,v2, etc.print-gensympara ver mejor lo que está sucediendo.print-gensymAFAICT :-( ¿Alguien tiene una explicación de por qué el(gensym "v")archivo fuentegv.elno segensym-counterprint-gensym, es probable que haya buscado en el lugar equivocado (intente enC-h olugar deC-h f). Ellet*en su código expandido es probablemente generado pormacroexp-let2qué usos enmake-symbollugar degensym.Respuestas:
De tu comentario lo has descubierto por ti mismo, pero ...
En la expansión de macro está viendo la representación impresa de dos símbolos independientes con el mismo nombre. Lo más probable es que ambos símbolos no estén entrelazados.
Una representación impresa como esta, si se pasa de nuevo al lector de lisp, no sería equivalente al original, ya que el lector de lisp internaría los símbolos.
Esto es similar a:
fuente
print-gensymyprint-circlealtproduce una representación impresa que se puede leer de nuevo a algo equivalente.