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í?
Extrañamente, el código para
—
PHS
setfen el archivo de origen gv.elparece crear los vsí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-gensympara ver mejor lo que está sucediendo.
@stefan: Tengo emacs-26.1 y no tiene
—
adjunta
print-gensymAFAICT :-( ¿Alguien tiene una explicación de por qué el (gensym "v")archivo fuente gv.elno 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 olugar de C-h f). El let*en su código expandido es probablemente generado por macroexp-let2qué usos en make-symbollugar de gensym.
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.