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?
elisp-macros
setf
phs
quelle
quelle
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
.setf
in Quelldateigv.el
scheint die zu schaffenv
Symbole mit einer Vanille-Verwendung(gensym "v")
und dies sollte einen Zählerwert nach dem „v“ Präfix anfügen, uninterned Symbole zu schaffenv0
,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-Dateigv.el
nicht angehängt wirdgensym-counter
?!print-gensym
, dass Sie wahrscheinlich nur an der falschen Stelle gesucht haben (versuchen Sie esC-h o
stattdessenC-h f
). Derlet*
in Ihrem erweiterten Code wird wahrscheinlich eher vonmacroexp-let2
verwendetmake-symbol
als verwendetgensym
.Antworten:
Aus Ihrem Kommentar haben Sie dies selbst herausgefunden, aber ...
In der Makroerweiterung sehen Sie die gedruckte Darstellung zweier unabhängiger Symbole mit demselben Namen. Höchstwahrscheinlich sind beide Symbole nicht interterniert.
Eine gedruckte Darstellung wie diese wäre, wenn sie an den Lisp-Leser zurückgegeben würde, nicht gleichbedeutend mit dem Original, da der Lisp-Leser die Symbole internieren würde.
Dies ist ähnlich wie:
quelle
print-gensym
undprint-circle
umt
eine gedruckte Darstellung zu erzeugen, die auf etwas Äquivalentes zurücklesen kann.