Ich versuchte zu verstehen, was setfich 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?
setfin Quelldatei gv.elscheint die zu schaffen vSymbole 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, v2etc.
print-gensymum besser zu sehen, was los ist.
print-gensymAFAICT :-( Hat jemand eine Erklärung, warum die (gensym "v")In-Source-Datei gv.elnicht angehängt wird gensym-counter?!
print-gensym, dass Sie wahrscheinlich nur an der falschen Stelle gesucht haben (versuchen Sie es C-h ostattdessen C-h f). Der let*in Ihrem erweiterten Code wird wahrscheinlich eher von macroexp-let2verwendet make-symbolals verwendet gensym.
vSymbole 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.