我认为这在常见的Lisp中是可能的(通过重载setf),但对emacslisp并不确定。
我想做的是:

(setf (local variable) value)

其中表单(local ...)将调用我编写的一些代码,并返回用于设置其值槽的符号。
编辑:从gv.el看来,建议gv-get可以胜任这项工作,但也许有更好的程序呢?
编辑2:尝试了斯特凡的建议,很接近,但不好:(
(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部分的方法。
编辑3:
好吧,除非我在变量值的作用域或求值序列中严重地弄错了什么,否则这似乎是有效的:
(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)))))

最佳答案

gv-define-expandergv-define-settergv-define-simple-setter(为了提高使用的简单性)。
您可能希望尝试100%保证的未测试代码(注意我如何将with-current-buffer+setq传递给do,而不是使用伪参数调用do,这样当与push一起使用时,这些东西就有了工作的机会)。

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

关于emacs - 为setf添加新的变量指示符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13416796/

10-13 07:15