setf私は何ができるかを理解しようとして、
(macroexpand '(setf (aref vec i) val))
⇒ (let* ((v vec) (v i)) (aset v v val))
これは明らかに間違っているようです。
しかし、(setf (aref ..失敗する実際のインスタンスを作成できませんでした。例えば
(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]
誰かがここで何が起こっているのか説明できますか?
不思議なことに、のコード
—
PHSを
setfのソースファイルでは、gv.el作成しているようだvのバニラを使用してシンボルを(gensym "v")インターンシンボル作成し、これは「V」接頭辞の後にカウンタ値を追加する必要がありv0、v1、v2、など
print-gensym何が起こっているのかをよく理解するために遊んでみてください。
@stefan:emacs-26.1があり、
—
phs
print-gensymAFAICT がありません:-( (gensym "v")ソースファイルgv.elが追加されない理由を誰かが説明していますgensym-counterか?!
私はあなたが持っていると確信しています
—
ステファン
print-gensym、あなたはおそらく間違った場所を見ただけです(のC-h o代わりに試してくださいC-h f)。let*あなたの拡大のコードでは、おそらくによって生成さmacroexp-let2れた用途make-symbolではなくgensym。
vシンボルは同じではなく、を(let* ((form (macroexpand '(setf (aref vec i) val))) (symb1 (caar (cadr form))) (symb2 (caar (cdadr form)))) (equal symb1 symb2))返しますnil。