Tentando entender o que setfposso fazer, liguei para
(macroexpand '(setf (aref vec i) val))
⇒ (let* ((v vec) (v i)) (aset v v val))
Isso parece obviamente errado.
No entanto, não consegui criar uma instância real em que (setf (aref ..falha. Por exemplo
(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]
Alguém pode explicar o que está acontecendo aqui?
Estranhamente, o código para
—
PHS
setfno arquivo de origem gv.elparece criar os vsímbolos com um uso de baunilha de (gensym "v")e isto deve acrescentar um valor de contador após o prefixo "v", criando símbolos uninterned v0, v1, v2, etc.
Você pode brincar
—
Stefan
print-gensympara ver melhor o que está acontecendo.
@stefan: Eu tenho emacs-26.1 e não tem
—
PHS
print-gensymAFAICT :-( Alguém tem uma explicação por que o (gensym "v")no arquivo de origem gv.elnão acrescentar gensym-counter?!
Eu tenho certeza que você tem
—
Stefan
print-gensym, você provavelmente apenas olhou para o lugar errado (tente em C-h ovez de C-h f). O let*seu código expandida é provavelmente gerado pelo macroexp-let2que usa make-symbol, em vez de gensym.
vsímbolos não são os mesmos e(let* ((form (macroexpand '(setf (aref vec i) val))) (symb1 (caar (cadr form))) (symb2 (caar (cdadr form)))) (equal symb1 symb2))retornamnil.