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-gensym
AFAICT がありません:-( (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
。