これはCommonLispで(オーバーロードによって)可能だと思いますが、setf
EmacsLispについてはよくわかりません。
私がやりたいことは次のようなものです:
(setf (local variable) value)
ここで、フォーム(local ...)
は私が書いたコードを呼び出し、その値スロットの設定に使用するシンボルを返します。
編集:gv.elを見ると、アドバイスgv-get
がその仕事をするように思えますが、おそらくそれのためのより良い手順がありますか?
EDIT2:ステファンからの提案を試してみました、近いですが、良くありません:(
(gv-define-setter local (value varname &optional buffer)
`(with-current-buffer (or ,buffer (current-buffer))
(setq ,varname ,value)))
これは次のように拡張されます。
(let* ((v bar))
(with-current-buffer (or nil (current-buffer))
(setq v 42)))
明らかに、私が望んでいたものではありません。私は上記のようにアドバイスとでそれをやろうとしていましたがgv-define-expander
、引用が多すぎてlet
、冗長な置換で式の一部を失う方法を見つけることができません。
EDIT3:
OK、変数が設定される値のスコープまたは評価シーケンスで何かを真剣に台無しにしない限り、これは機能しているようです。
(gv-define-expander local
(lambda (do &rest args)
(let ((varname (first args))
(buffer (or (second args) '(current-buffer)))
(value (funcall do nil #'identity)))
`(with-current-buffer ,buffer
(setq ,varname ,value)))))