1

これはCommonLispで(オーバーロードによって)可能だと思いますが、setfEmacsLispについてはよくわかりません。

私がやりたいことは次のようなものです:

(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)))))
4

1 に答える 1

1

、、、および(使いやすさを増すために)がありますgv-define-expandergv-define-settergv-define-simple-setter

100%保証されたテストされていないコードを試してみることをお勧めします(ダミーの引数で呼び出すのではなく、with-current-buffer+setqに渡す方法に注意してください。これを使用すると、このコードが機能する可能性があります)。dodopush

(gv-define-expander local
  (lambda (do &rest varname &optional buffer)
    (macroexp-let2 nil b buffer
      (funcall do `(buffer-local-value ',varname ,b)
               (lambda (value)
                `(with-current-buffer ,b
                   (setq ,varname ,value)))))))
于 2012-11-16T14:47:28.290 に答える