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í?
Extrañamente, el código para
—
PHS
setf
en el archivo de origen gv.el
parece crear los v
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 uninterned v0
, v1
, v2
, etc.
Es posible que desee jugar
—
Stefan
print-gensym
para ver mejor lo que está sucediendo.
@stefan: Tengo emacs-26.1 y no tiene
—
adjunta
print-gensym
AFAICT :-( ¿Alguien tiene una explicación de por qué el (gensym "v")
archivo fuente gv.el
no se gensym-counter
Estoy bastante seguro de que sí
—
Stefan
print-gensym
, es probable que haya buscado en el lugar equivocado (intente en C-h o
lugar de C-h f
). El let*
en su código expandido es probablemente generado por macroexp-let2
qué usos en make-symbol
lugar de gensym
.
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
.