Ich versuchte zu verstehen, was setf
ich tun kann, und rief an
(macroexpand '(setf (aref vec i) val))
⇒ (let* ((v vec) (v i)) (aset v v val))
Dies scheint offensichtlich falsch.
Ich konnte jedoch keine tatsächliche Instanz erstellen, bei der ein Fehler (setf (aref ..
auftritt. Z.B
(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]
Kann jemand erklären, was hier los ist?
setf
in Quelldatei gv.el
scheint die zu schaffen v
Symbole mit einer Vanille-Verwendung (gensym "v")
und dies sollte einen Zählerwert nach dem „v“ Präfix anfügen, uninterned Symbole zu schaffen v0
, v1
, v2
etc.
print-gensym
um besser zu sehen, was los ist.
print-gensym
AFAICT :-( Hat jemand eine Erklärung, warum die (gensym "v")
In-Source-Datei gv.el
nicht angehängt wird gensym-counter
?!
print-gensym
, dass Sie wahrscheinlich nur an der falschen Stelle gesucht haben (versuchen Sie es C-h o
stattdessen C-h f
). Der let*
in Ihrem erweiterten Code wird wahrscheinlich eher von macroexp-let2
verwendet make-symbol
als verwendet gensym
.
v
Symbole sind nicht identisch und(let* ((form (macroexpand '(setf (aref vec i) val))) (symb1 (caar (cadr form))) (symb2 (caar (cdadr form)))) (equal symb1 symb2))
kehren zurücknil
.