Tentando entender o que setf
posso 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
setf
no arquivo de origem gv.el
parece criar os v
sí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-gensym
para ver melhor o que está acontecendo.
@stefan: Eu tenho emacs-26.1 e não tem
—
PHS
print-gensym
AFAICT :-( Alguém tem uma explicação por que o (gensym "v")
no arquivo de origem gv.el
nã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 o
vez de C-h f
). O let*
seu código expandida é provavelmente gerado pelo macroexp-let2
que usa make-symbol
, em vez de gensym
.
v
sí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
.