1

我认为这在 Common Lisp 中是可能的(通过重载setf),但不确定 Emacs Lisp。

我想做的是:

(setf (local variable) value)

表单(local ...)将调用我编写的一些代码并返回用于设置其值槽的符号。

编辑:从 gv.el 看来,建议似乎gv-get可以完成这项工作,但也许有更好的程序呢?

EDIT2:尝试了 Stefan 的建议,关闭,但不好:(

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

显然,不是我想要的。我试图通过上面提到的建议和 with 来做到这一点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)))))
4

1 回答 1

1

gv-define-expander, gv-define-setter, 和gv-define-simple-setter(按使用简单的顺序排列)。

您可能想尝试 100% 保证未经测试的代码(请注意我如何传递with-current-buffer+setqtodo而不是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)))))))
于 2012-11-16T14:47:28.290 回答