Intentando entender qué setf
puedo 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
v
sí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
.setf
en el archivo de origengv.el
parece crear losv
sí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-gensym
para ver mejor lo que está sucediendo.print-gensym
AFAICT :-( ¿Alguien tiene una explicación de por qué el(gensym "v")
archivo fuentegv.el
no segensym-counter
print-gensym
, es probable que haya buscado en el lugar equivocado (intente enC-h o
lugar deC-h f
). Ellet*
en su código expandido es probablemente generado pormacroexp-let2
qué usos enmake-symbol
lugar 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-gensym
yprint-circle
alt
produce una representación impresa que se puede leer de nuevo a algo equivalente.